Averages/Mean angle: Difference between revisions
m
→{{header|Wren}}: Minor tidy
m (→{{header|Wren}}: Minor tidy) |
|||
(24 intermediate revisions by 18 users not shown) | |||
Line 1:
[[Category:Geometry]]
{{task}}
Line 19 ⟶ 20:
::<math>\bar{\alpha} = \operatorname{atan2}\left(\frac{1}{n}\cdot\sum_{j=1}^n \sin\alpha_j, \frac{1}{n}\cdot\sum_{j=1}^n \cos\alpha_j\right) </math>
;Task
# write a function/method/subroutine/... that given a list of angles in degrees returns their mean angle. <br> (You should use a built-in function if you have one that does this for degrees or radians).
Line 36 ⟶ 37:
=={{header|11l}}==
{{trans|C#}}
<
V x = sum(angles.map(a -> cos(radians(a)))) / angles.len
V y = sum(angles.map(a -> sin(radians(a)))) / angles.len
Line 43 ⟶ 44:
print(mean_angle([350, 10]))
print(mean_angle([90, 180, 270, 360]))
print(mean_angle([10, 20, 30]))</
{{out}}
<pre>
Line 53 ⟶ 54:
=={{header|Ada}}==
An implementation based on the formula using the "Arctan" (atan2) function, thus avoiding complex numbers:
<
procedure Mean_Angles is
Line 86 ⟶ 87:
Put(Mean_Angle((10.0, 350.0))); Ada.Text_IO.New_Line; -- 0.00
Put(Mean_Angle((90.0, 180.0, 270.0, 360.0))); -- Ada.Numerics.Argument_Error!
end Mean_Angles;</
{{out}}
<pre> 20.00
Line 92 ⟶ 93:
raised ADA.NUMERICS.ARGUMENT_ERROR : a-ngelfu.adb:427 instantiated at mean_angles.adb:17</pre>
=={{header|Aime}}==
<syntaxhighlight lang="aime">real
mean(list l)
{
integer i;
real x, y;
x = y = 0;
i = 0;
while (i < l_length(l)) {
x += Gcos(l[i]);
y += Gsin(l[i]);
i += 1;
}
return Gatan2(y / l_length(l), x / l_length(l));
}
integer
main(void)
{
o_form("mean of 1st set: /d6/\n", mean(l_effect(350, 10)));
o_form("mean of 2nd set: /d6/\n", mean(l_effect(90, 180, 270, 360)));
o_form("mean of 3rd set: /d6/\n", mean(l_effect(10, 20, 30)));
return 0;
}</syntaxhighlight>
{{out}}
<pre>mean of 1st set: -.000000
mean of 2nd set: -90
mean of 3rd set: 19.999999</pre>
=={{header|ALGOL 68}}==
{{works with|ALGOL 68|Revision 1}}
Line 97 ⟶ 132:
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}}
{{trans|C|Note: This specimen retains the original [[#C|C]] coding style}}
'''File: Averages_Mean_angle.a68'''<
# -*- coding: utf-8 -*- #
Line 122 ⟶ 157:
printf ((summary fmt,"2nd", mean angle (angle set 2)));
printf ((summary fmt,"3rd", mean angle (angle set 3)))
)</
<pre>
Mean angle for 1st set : -0.00000 degrees
Line 128 ⟶ 163:
Mean angle for 3rd set : 20.00000 degrees
</pre>
=={{header|AutoHotkey}}==
{{works with|AutoHotkey 1.1}}
<
MsgBox, % MeanAngle(Angles[1]) "`n"
. MeanAngle(Angles[2]) "`n"
Line 180 ⟶ 182:
atan2(x, y) {
return dllcall("msvcrt\atan2", "Double",y, "Double",x, "CDECL Double")
}</
'''Output:'''
<pre>-0.000000
Line 187 ⟶ 189:
=={{header|AWK}}==
<
{
PI = atan2(0,-1);
Line 199 ⟶ 201:
if (p<0) p += 360;
print p;
}</
<pre> echo 350 10 | ./mean_angle.awk
360
Line 209 ⟶ 211:
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<
DIM angles(3)
angles() = 350,10
Line 228 ⟶ 230:
DEF FNatan2(y,x) : ON ERROR LOCAL = SGN(y)*PI/2
IF x>0 THEN = ATN(y/x) ELSE IF y>0 THEN = ATN(y/x)+PI ELSE = ATN(y/x)-PI</
{{out}}
<pre>
Line 237 ⟶ 239:
=={{header|C}}==
<
#include<stdio.h>
Line 266 ⟶ 268:
printf ("\nMean Angle for 3rd set : %lf degrees\n", meanAngle (angleSet3, 3));
return 0;
}</
{{out}}
<pre>Mean Angle for 1st set : -0.000000 degrees
Mean Angle for 2nd set : -90.000000 degrees
Mean Angle for 3rd set : 20.000000 degrees</pre>
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
using System.Linq;
using static System.Math;
class Program
{
static double MeanAngle(double[] angles)
{
var x = angles.Sum(a => Cos(a * PI / 180)) / angles.Length;
var y = angles.Sum(a => Sin(a * PI / 180)) / angles.Length;
return Atan2(y, x) * 180 / PI;
}
static void Main()
{
Action<double[]> printMean = x => Console.WriteLine("{0:0.###}", MeanAngle(x));
printMean(new double[] { 350, 10 });
printMean(new double[] { 90, 180, 270, 360 });
printMean(new double[] { 10, 20, 30 });
}
}</syntaxhighlight>
{{out}}
<pre>0
-90
20</pre>
=={{header|C++}}==
{{trans|C#}}
<
#include <iostream>
#include <vector>
Line 310 ⟶ 337:
return 0;
}</
{{out}}
<pre>-0.000
-90.000
20.000</pre>
=={{header|Clojure}}==
<
[k coll]
(let [n (count coll)
Line 353 ⟶ 355:
a (mean-fn :sin radians)
b (mean-fn :cos radians)]
(Math/toDegrees (Math/atan2 a b))))</
Example:
<
;=> -1.614809932057922E-15
Line 362 ⟶ 364:
(mean-angle [10 20 30])
;=> 19.999999999999996</
=={{header|Common Lisp}}==
<
(/ (reduce #'+ list) (length list)))
Line 372 ⟶ 374:
(defun degrees (angle)
(*
(defun mean-angle (angles)
Line 381 ⟶ 383:
(loop for angles in '((350 10) (90 180 270 360) (10 20 30))
do (format t "~&The mean angle of ~a is ~$°." angles (mean-angle angles)))
;; or using complex numbers (cis and phase)
(defun mean-angle-2 (angles)
(degrees (phase (reduce #'+ angles :key (lambda (deg) (cis (radians deg)))))))
</syntaxhighlight>
{{out}}
<pre>The mean angle of (350 10) is -0.00°.
Line 388 ⟶ 396:
=={{header|D}}==
<
import std.math: PI;
Line 403 ⟶ 411:
writefln("The mean angle of %s is: %.2f degrees",
angles, angles.meanAngle);
}</
{{out}}
<pre>The mean angle of [350, 10] is: -0.00 degrees
The mean angle of [90, 180, 270, 360] is: 90.00 degrees
The mean angle of [10, 20, 30] is: 20.00 degrees</pre>
=={{header|Delphi}}==
See [[#Pascal]].
=={{header|EasyLang}}==
{{trans|C}}
<syntaxhighlight lang=easylang>
func mean ang[] .
for ang in ang[]
x += cos ang
y += sin ang
.
return atan2 (y / len ang[]) (x / len ang[])
.
print mean [ 350 10 ]
print mean [ 90 180 270 360 ]
print mean [ 10 20 30 ]
</syntaxhighlight>
=={{header|EchoLisp}}==
<
(define-syntax-rule (deg->radian deg) (* deg 1/180 PI))
(define-syntax-rule (radian->deg rad) (* 180 (/ PI) rad))
Line 426 ⟶ 449:
(mean-angles '[10 20 30])
→ 20
</syntaxhighlight>
=={{header|Elixir}}==
<syntaxhighlight lang="elixir">
defmodule MeanAngle do
def mean_angle(angles) do
Line 451 ⟶ 474:
IO.inspect MeanAngle.mean_angle([90, 180, 270, 360])
IO.inspect MeanAngle.mean_angle([10, 20, 30])
</syntaxhighlight>
{{out}}
<pre>
Line 461 ⟶ 484:
=={{header|Erlang}}==
The function from_degrees/1 is used to solve [[Averages/Mean_time_of_day]]. Please keep backwards compatibility when editing. Or update the other module, too.
<syntaxhighlight lang="erlang">
-module( mean_angle ).
-export( [from_degrees/1, task/0] ).
Line 481 ⟶ 504:
radians( Degrees ) -> Degrees * math:pi() / 180.
</syntaxhighlight>
{{out}}
<pre>
Line 491 ⟶ 514:
=={{header|Euler Math Toolbox}}==
<
$ z=sum(exp(rad(a)*I));
$ if z~=0 then error("Not meaningful");
Line 506 ⟶ 529:
if z~=0 then error("Not meaningful");
>meanangle([10,20,30])
20</
=={{header|Euphoria}}==
{{works with|OpenEuphoria}}
<syntaxhighlight lang="euphoria">
include std/console.e
include std/mathcons.e
Line 538 ⟶ 560:
if getc(0) then end if
</syntaxhighlight>
{{out}}
<pre>
Line 547 ⟶ 569:
=={{header|F_Sharp|F#}}==
<
open System.Numerics
Line 561 ⟶ 583:
|> fun c -> c.Phase |> rad2deg
|> printfn "Mean angle for [%s]: %g°" (String.Join("; ",argv))
0</
{{out}}
<pre>>RosettaCode 350 10
Line 574 ⟶ 596:
=={{header|Factor}}==
<
sequences ;
Line 584 ⟶ 606:
dup mean-angle "The mean angle of %u is: %f°\n" printf ;
{ { 350 10 } { 90 180 270 360 } { 10 20 30 } } [ show ] each</
{{out}}
<pre>
Line 594 ⟶ 616:
=={{header|Fortran}}==
Please find the example output along with the build instructions in the comments at the start of the FORTRAN 2008 source. Compiler: gfortran from the GNU compiler collection. Command interpreter: bash.
<syntaxhighlight lang="fortran">
!-*- mode: compilation; default-directory: "/tmp/" -*-
!Compilation started at Mon Jun 3 18:07:59
Line 631 ⟶ 653:
end do
end program average_angles
</syntaxhighlight>
=={{header|FreeBASIC}}==
<
' FB 1.05.0 Win64
Line 660 ⟶ 682:
Print "Press any key to quit the program"
Sleep
</syntaxhighlight>
{{out}}
Line 671 ⟶ 693:
=={{header|Go}}==
===Complex===
<
import (
Line 698 ⟶ 720:
fmt.Printf("The mean angle of %v is: %f degrees\n", angles, mean_angle(angles))
}
}</
{{out}}
<pre>
Line 708 ⟶ 730:
A mean_angle function that could be substituted above. Functions deg2rad and rad2deg are not used here but there is no runtime advantage either way to using them or not. Inlining should result in eqivalent code being generated. Also the Go Atan2 library function has no limits on the arguments so there is no need to divide by the number of elements.
<
var ss, sc float64
for _, x := range deg {
Line 716 ⟶ 738:
}
return math.Atan2(ss, sc) * 180 / math.Pi
}</
=={{header|Groovy}}==
<
def meanAngle = {
atan2( it.sum { sin(it * PI / 180) } / it.size(), it.sum { cos(it * PI / 180) } / it.size()) * 180 / PI
}</
Test:
<
def ma = meanAngle(angles)
printf("Mean Angle for $angles: %5.2f%n", ma)
Line 731 ⟶ 753:
assert verifyAngle([350, 10]) == -0
assert verifyAngle([90, 180, 270, 360]) == -90
assert verifyAngle([10, 20, 30]) == 20</
{{out}}
<pre>Mean Angle for [350, 10]: -0.00
Line 738 ⟶ 760:
=={{header|Haskell}}==
<
meanAngle
Line 752 ⟶ 774:
"The mean angle of " ++
show angles ++ " is: " ++ show (meanAngle angles) ++ " degrees")
[[350, 10], [90, 180, 270, 360], [10, 20, 30]]</
{{out}}
<pre>
Line 763 ⟶ 785:
Alternative Solution: This solution gives an insight about using factoring, many small functions like Forth and using function composition.
<
-- file: trigdeg.fs
Line 782 ⟶ 804:
-- End of trigdeg.fs --------
</syntaxhighlight>
{{out}}
Line 805 ⟶ 827:
=={{header|Icon}} and {{header|Unicon}}==
<
write("Mean angle is ",meanAngle(A))
end
Line 813 ⟶ 835:
every (sumCosines := 0.0) +:= cos(dtor(!A))
return rtod(atan(sumSines/*A,sumCosines/*A))
end</
Sample runs:
Line 823 ⟶ 845:
->ama 10 20 30
Mean angle is 20.0
</pre>
=={{header|IDL}}==
<syntaxhighlight lang="idl">function mean_angle, phi
z = total(exp(complex(0,phi*!dtor)))
return, atan(imaginary(z),real_part(z))*!radeg
end</syntaxhighlight>
{{out}}
<pre>IDL> print, mean_angle([350, 10])
-7.80250e-06
IDL> print, mean_angle([90, 180, 270, 360])
90.0000
IDL> print, mean_angle([10, 20, 30])
20.0000
</pre>
=={{header|J}}==
<
This verb can be represented as simpler component verbs, for example:
<
toComplex=: *.inv NB. maps integer pairs as length, complex angle (in radians)
mean=: +/ % # NB. calculate arithmetic mean
roundComplex=: (* * |)&.+. NB. discard an extraneous least significant bit of precision from a complex value whose magnitude is in the vicinity of 1
avgAngleR=: _1 { [: roundComplex@mean&.toComplex 1 ,. ] NB. calculate average angle in radians
avgAngleD=: 360|avgAngleR&.rfd NB. calculate average angle in degrees</
Example use:
<
0
avgAngleD 90 180 270 360 NB. result not meaningful
Line 844 ⟶ 881:
5
avgAngleD 10 340
355</
Notes:
Line 865 ⟶ 902:
{{trans|NetRexx}}
{{works with|Java|7+}}
<
public class AverageMeanAngle {
Line 894 ⟶ 931:
return Math.toDegrees(avgR);
}
}</
{{out}}
<pre>The mean angle of [350.0, 10.0] is -1.614809932057922E-15
Line 904 ⟶ 941:
=={{header|JavaScript}}==
===atan2===
<
var s = 0;
for (var i = 0; i < a.length; i++) s += a[i];
Line 924 ⟶ 961:
console.log(meanAngleDeg(a));
console.log(meanAngleDeg(b));
console.log(meanAngleDeg(c));</
{{out}}
<pre>-1.614809932057922e-15
Line 937 ⟶ 974:
'''Generic Infrastructure'''
<
def deg2rad: . * pi / 180;
Line 955 ⟶ 992:
def abs: if . < 0 then - . else . end;
def summation(f): map(f) | add;</
'''Mean Angle'''
<
def mean_angle:
def round:
Line 972 ⟶ 1,009:
| .[1]
| rad2deg
| round;</
'''Examples'''
<
| "The mean angle of \(.) is: \(mean_angle)"</
{{out}}
<
The mean angle of [350,10] is: 0
The mean angle of [90,180,270,360] is: null
The mean angle of [10,20,30] is: 20</
=={{header|Julia}}==
Julia has built-in functions <code>sind</code> and <code>cosd</code> to compute the sine and cosine of angles specified in degrees accurately (avoiding the roundoff errors incurred in conversion to radians), and a built-in function to convert radians to degrees (or vice versa). Using these:
<
meandegrees(degrees) =
The output is:
<
0.0
Line 995 ⟶ 1,032:
julia> meandegrees([10, 20, 30]])
19.999999999999996</
(Note that the mean of 90°, 180°, 270°, and 360° gives zero because of the lack of roundoff errors in the <code>sind</code> function, since the standard-library <code>atan2(0,0)</code> value is zero. Many of the other languages report an average of 90° or –90° in this case due to rounding errors.)
=={{header|Kotlin}}==
<
fun meanAngle(angles: DoubleArray): Double {
Line 1,015 ⟶ 1,052:
println("Mean for angles 2 is ${fmt.format(meanAngle(angles2))}")
println("Mean for angles 3 is ${fmt.format(meanAngle(angles3))}")
}</
{{out}}
Line 1,025 ⟶ 1,062:
=={{header|Liberty BASIC}}==
<
Pi =3.1415926535
Line 1,066 ⟶ 1,103:
if y =0 and x =0 then notice "undefined": end
atan2 =at
end function</
{{out}}
<pre>
Line 1,073 ⟶ 1,110:
Mean Angle( "10,20,30") = 20.0 degrees.
</pre>
=={{header|Logo}}==
<
local "avgsin
make "avgsin quotient apply "sum map "sin :angles count :angles
Line 1,087 ⟶ 1,125:
bye
</syntaxhighlight>
{{Out}}
Line 1,097 ⟶ 1,135:
{{trans|Tcl}}
{{works with|Lua|5.1}}
<
local sumSin, sumCos = 0, 0
for i, angle in pairs(angleList) do
Line 1,109 ⟶ 1,147:
print(meanAngle({350, 10}))
print(meanAngle({90, 180, 270, 360}))
print(meanAngle({10, 20, 30}))</
{{out}}
<pre>
Line 1,119 ⟶ 1,157:
=={{header|Maple}}==
The following procedure takes a list of numeric degrees (with attached units) such as
<
[350 [arcdeg], 10 [arcdeg]]</
as input. (We could use "degree" instead of "arcdeg", since "degree" is taken, by default, to mean angle measure, but it seems best to avoid the ambiguity.)
<
uses Units:-Standard; # for unit-awareness
local u;
evalf( convert( argument( add( u, u = exp~( I *~ L ) ) ), 'units', 'radian', 'degree' ) )
end proc:</
Applying this to the given data sets, we obtain:
<
0.
Line 1,135 ⟶ 1,173:
> MeanAngle( [ 10, 20, 30 ] *~ Unit(arcdeg) );
20.00000000</
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<
{{out}}
<pre>meanAngle /@ {{350, 10}, {90, 180, 270, 360}, {10, 20, 30}}
Line 1,144 ⟶ 1,182:
=={{header|MATLAB}} / {{header|Octave}}==
<
u = angle(mean(exp(i*pi*phi/180)))*180/pi;
end</
<pre> mean_angle([350, 10])
ans = -2.7452e-14
Line 1,153 ⟶ 1,191:
mean_angle([10, 20, 30])
ans = 20.000
</pre>
=={{header|MiniScript}}==
<syntaxhighlight lang="miniscript">
atan2 = function(y, x)
return 2 * atan((sqrt(x^2 + y^2) - x) / y)
end function
deg2rad = function(x); return x * pi / 180; end function
rad2deg = function(x); return x * 180 / pi; end function
meanAngle = function(angles)
xsum = 0; ysum = 0
for angle in angles
xsum += cos(deg2rad(angle))
ysum += sin(deg2rad(angle))
end for
return rad2deg(atan2(ysum / angles.len, xsum / angles.len))
end function
manyAngledOnes = [[350, 10], [90, 180, 270, 360], [10, 20, 30]]
for angles in manyAngledOnes
mean = meanAngle(angles)
print ["Mean of", angles, "is", mean].join(" ")
end for
</syntaxhighlight>
{{out}}
<pre>
Mean of [350, 10] is 0
Mean of [90, 180, 270, 360] is -90
Mean of [10, 20, 30] is 20.0
</pre>
=={{header|NetRexx}}==
{{trans|C}}
<
options replace format comments java crossref symbols nobinary
numeric digits 80
Line 1,190 ⟶ 1,260:
end angles
return
</syntaxhighlight>
{{out}}
<pre>
Line 1,210 ⟶ 1,280:
=={{header|Nim}}==
{{works with|Nim|0.20.0+}}
<syntaxhighlight lang="nim">import math, complex
proc meanAngle(deg: openArray[float]): float =
var c: Complex[float]
for d in deg:
c += rect(1.0,
echo "The 1st mean angle is: ", meanAngle([350.0, 10.0]), " degrees"
echo "The 2nd mean angle is: ", meanAngle([90.0, 180.0, 270.0, 360.0]), " degrees"
echo "The 3rd mean angle is: ", meanAngle([10.0, 20.0, 30.0]), " degrees"</
Output:
<pre>The 1st mean angle is: -
The 2nd mean angle is: -90.0 degrees
The 3rd mean angle is: 20.0 degrees</pre>
Line 1,234 ⟶ 1,299:
=={{header|Oberon-2}}==
{{works with|oo2c}}
<
MODULE MeanAngle;
IMPORT
Line 1,267 ⟶ 1,332:
Out.LongRealFix(Mean(grades) * toDegs,15,9);Out.Ln;
END MeanAngle.
</syntaxhighlight>
{{out}}
<pre>
Line 1,276 ⟶ 1,341:
=={{header|OCaml}}==
<
let deg2rad d =
Line 1,300 ⟶ 1,365:
test [90.0; 180.0; 270.0; 360.0];
test [10.0; 20.0; 30.0];
;;</
or using the <code>Complex</code> module:
<
let mean_angle angles =
Line 1,308 ⟶ 1,373:
List.fold_left (fun sum a -> add sum (polar 1.0 (deg2rad a))) zero angles
in
rad2deg (arg sum)</
{{out}}
<pre>
Line 1,318 ⟶ 1,383:
=={{header|ooRexx}}==
{{trans|REXX}}
<
numeric digits 50 /*use fifty digits of precision, */
showDig=10 /*··· but only display 10 digits.*/
Line 1,341 ⟶ 1,406:
return left('angles='a,30) 'mean angle=' format(mA,,showDig,0)/1
::requires rxMath library;</
{{out}}
<pre>angles=350 10 mean angle= 0
angles=90 180 270 360 mean angle= 0
angles=10 20 30 mean angle= 20</pre>
=={{header|PARI/GP}}==
<
meanDegrees(v)=meanAngle(v*Pi/180)*180/Pi
apply(meanDegrees,[[350, 10], [90, 180, 270, 360], [10, 20, 30]])</
{{out}}
<pre>[360.000000, 296.565051, 20.0000000]</pre>
=={{header|Pascal}}==
uses library math for sincos, a function of FPU80x87, atan2 and DegToRad.
Tested with free pascal.
Try to catch very small cos values and set to 0.0 degrees " Error : Not meaningful" as http://rosettacode.org/wiki/Averages/Mean_angle#Euler_Math_Toolbox complains.
<
{$IFDEF DELPHI}
{$APPTYPE CONSOLE}
Line 1,427 ⟶ 1,493:
setlength(a,0);
end.</
;output:
<pre>
Line 1,435 ⟶ 1,501:
=={{header|Perl}}==
<
sub meanangle {
Line 1,451 ⟶ 1,517:
print "The mean angle of [@$_] is: ", meandegrees(@$_), " degrees\n"
for ([350,10], [90,180,270,360], [10,20,30]);</
{{out}}
<pre>
Line 1,458 ⟶ 1,524:
The mean angle of [10 20 30] is: 20 degrees
</pre>
=={{header|Phix}}==
Copied from [[Averages/Mean_angle#Euphoria|Euphoria]], and slightly improved
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">MeanAngle</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">angles</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">angles</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">ai_rad</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">angles</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]*</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">/</span><span style="color: #000000;">180</span>
<span style="color: #000000;">x</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">cos</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ai_rad</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">sin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ai_rad</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">1e-16</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #008000;">"not meaningful"</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%g"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">round</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">atan2</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">180</span><span style="color: #0000FF;">/</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1e10</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">AngleLists</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">350</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">90</span><span style="color: #0000FF;">,</span><span style="color: #000000;">180</span><span style="color: #0000FF;">,</span><span style="color: #000000;">270</span><span style="color: #0000FF;">,</span><span style="color: #000000;">360</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span><span style="color: #000000;">30</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">180</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">180</span><span style="color: #0000FF;">}}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">AngleLists</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ai</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">AngleLists</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%16V: Mean Angle is %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ai</span><span style="color: #0000FF;">,</span><span style="color: #000000;">MeanAngle</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ai</span><span style="color: #0000FF;">)})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
{350,10}: Mean Angle is
{90,180,270,360}: Mean Angle is not meaningful
{10,20,30}: Mean Angle is
{180}: Mean Angle is 180
{0,180}: Mean Angle is not meaningful
</pre>
Line 1,520 ⟶ 1,557:
=={{header|PHP}}==
{{trans|C}}
<
$samples = array(
'1st' => array(350, 10),
Line 1,542 ⟶ 1,579:
return rad2deg(atan2($y_part, $x_part));
}
?></
{{out}}
<pre>Mean angle for 1st sample: -1.6148099320579E-15 degrees.
Line 1,549 ⟶ 1,586:
=={{header|PicoLisp}}==
<
(de meanAngle (Lst)
Line 1,562 ⟶ 1,599:
"The mean angle of ["
(glue ", " (mapcar round L '(0 .)))
"] is: " (round (meanAngle L))) )</
{{out}}
<pre>The mean angle of [350, 10] is: 0.000
Line 1,569 ⟶ 1,606:
=={{header|PL/I}}==
<
declare b1(2) fixed initial (350, 10);
declare b2(4) fixed initial (90, 180, 270, 360);
Line 1,586 ⟶ 1,623:
end mean;
end averages;</
Results (the final one brings up an error in inverse tangent):
<pre>
Line 1,597 ⟶ 1,634:
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
function Get-MeanAngle ([double[]]$Angles)
{
Line 1,605 ⟶ 1,642:
[Math]::Atan2($y, $x) * 180 / [Math]::PI
}
</syntaxhighlight>
<syntaxhighlight lang="powershell">
@(350, 10), @(90, 180, 270, 360), @(10, 20, 30) | ForEach-Object {Get-MeanAngle $_}
</syntaxhighlight>
{{Out}}
Line 1,617 ⟶ 1,654:
20
</pre>
=={{header|Processing}}==
<syntaxhighlight lang="processing">void setup() {
println(meanAngle(350, 10));
println(meanAngle(90, 180, 270, 360));
println(meanAngle(10, 20, 30));
}
float meanAngle(float... angles) {
float sum1 = 0, sum2 = 0;
for (int i = 0; i < angles.length; i++) {
sum1 += sin(radians(angles[i])) / angles.length;
sum2 += cos(radians(angles[i])) / angles.length;
}
return degrees(atan2(sum1, sum2));
}</syntaxhighlight>
{{out}}
<pre>-7.8025005E-6
90.0
20.0</pre>
=={{header|PureBasic}}==
<syntaxhighlight lang="purebasic">NewList angle.d()
Macro AE(x)
AddElement(angle()) : angle()=x
EndMacro
Procedure.d atan3(y.d,x.d)
If x<=0.0 : ProcedureReturn Sign(y)*#PI/2 : EndIf
If x>0.0 : ProcedureReturn ATan(y/x) : EndIf
If y>0.0 : ProcedureReturn ATan(y/x)+#PI : EndIf
ProcedureReturn ATan(y/x)-#PI
EndProcedure
Procedure.d mAngle(List angle.d())
Define.d sumS,sumC
ForEach angle()
sumS+Sin(Radian(angle())) : sumC+Cos(Radian(angle()))
Next
ProcedureReturn Degree(atan3(sumS,sumC))
EndProcedure
AE(350.0) : AE(10.0)
Debug StrD(mAngle(angle()),6) : ClearList(angle())
AE(90.0) : AE(180.0) : AE(270.0) : AE(360.0)
Debug StrD(mAngle(angle()),6) : ClearList(angle())
AE(10.0) : AE(20.0) : AE(30.0)
Debug StrD(mAngle(angle()),6) : ClearList(angle())
</syntaxhighlight>
{{out}}
<pre>-0.000000
-90.000000
20.000000</pre>
=={{header|Python}}==
{{works with|Python|2.6+}}
<
>>> from math import radians, degrees
>>> def mean_angle(deg):
Line 1,631 ⟶ 1,724:
The mean angle of [90, 180, 270, 360] is: -90.0 degrees
The mean angle of [10, 20, 30] is: 20.0 degrees
>>> </
=={{header|R}}==
<syntaxhighlight lang="r">
deg2rad <- function(x) {
x * pi/180
}
rad2deg <- function(x) {
x * 180/pi
}
deg2vec <- function(x) {
c(sin(deg2rad(x)), cos(deg2rad(x)))
}
vec2deg <- function(x) {
res <- rad2deg(atan2(x[1], x[2]))
if (res < 0) {
360 + res
} else {
res
}
}
mean_vec <- function(x) {
y <- lapply(x, deg2vec)
Reduce(`+`, y)/length(y)
}
mean_deg <- function(x) {
vec2deg(mean_vec(x))
}
mean_deg(c(350, 10))
mean_deg(c(90, 180, 270, 360))
mean_deg(c(10, 20, 30))
</syntaxhighlight>
{{out}}
<pre>
360
270
20
</pre>
=={{header|Racket}}==
The formula given above can be straightforwardly transcribed into a program:
<
#lang racket
Line 1,651 ⟶ 1,787:
(mean-angle '(90 180 270 360))
(mean-angle '(10 20 30))
</syntaxhighlight>
{{out}}
<pre>
Line 1,658 ⟶ 1,794:
19.999999999999996
</pre>
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2015.12}}
This solution refuses to return an answer when the angles cancel out to a tiny magnitude.
<syntaxhighlight lang="raku" line># Of course, you can still use pi and 180.
sub deg2rad { $^d * tau / 360 }
sub rad2deg { $^r * 360 / tau }
sub phase ($c) {
my ($mag,$ang) = $c.polar;
return NaN if $mag < 1e-16;
$ang;
}
sub meanAngle { rad2deg phase [+] map { cis deg2rad $_ }, @^angles }
say meanAngle($_).fmt("%.2f\tis the mean angle of "), $_ for
[350, 10],
[90, 180, 270, 360],
[10, 20, 30];</syntaxhighlight>
{{out}}
<pre>-0.00 is the mean angle of 350 10
NaN is the mean angle of 90 180 270 360
20.00 is the mean angle of 10 20 30</pre>
=={{header|REXX}}==
Line 1,706 ⟶ 1,867:
REXX statements
<br>into single lines would increase the program's bulk and detract from the main program.
<
call pi /*define the value of pi to some accuracy.*/
numeric digits length(pi) - 1; /*use PI width decimal digits of precision,*/
Line 1,760 ⟶ 1,921:
do j=0 while h>9; m.j= h; h= h % 2 + 1; end /*j*/
do k=j+5 to 0 by -1; numeric digits m.k; g= (g + x/g) * .5; end /*k*/
return g</
{{out|output|text= when using the default internal inputs:}}
<pre>
Line 1,770 ⟶ 1,931:
=={{header|Ring}}==
<
# Project : Averages/Mean angle
Line 1,805 ⟶ 1,966:
ok
ok
</syntaxhighlight>
Output:
<pre>
Line 1,811 ⟶ 1,972:
-90
20.000000
</pre>
=={{header|RPL}}==
≪ DEG → angles
≪ 0 1 angles SIZE '''FOR''' j
1 angles j GET R→C P→R + '''NEXT'''
angles SIZE / ARG
≫ ≫ ''''MEANG'''' STO
{{in}}
<pre>
{ 350 10 } MEANG
{ 90 180 270 360 } MEANG
{ 10 20 30 } MEANG
</pre>
{{out}}
<pre>
3: 0
2: -90
1: 20
</pre>
=={{header|Ruby}}==
<
def deg2rad(d)
Line 1,830 ⟶ 2,010:
[[350, 10], [90, 180, 270, 360], [10, 20, 30]].each {|angles|
puts "The mean angle of %p is: %f degrees" % [angles, mean_angle(angles)]
}</
{{out}}
<pre>
Line 1,840 ⟶ 2,020:
=={{header|Rust}}==
<
use std::f64;
// the macro is from
Line 1,884 ⟶ 2,064:
assert_diff!(20.0, mean_angle(&angles3), 0.001);
}
</syntaxhighlight>
=={{header|Scala}}==
{{libheader|Scala}}<
import scala.math.{Pi, atan2, cos, sin}
Line 1,905 ⟶ 2,085:
assert(meanAngle(List(10, 20, 30)).round == 20, "Unexpected result with 10, 20, 30")
println("Successfully completed without errors.")
}</
=={{header|Scheme}}==
Line 1,911 ⟶ 2,091:
{{trans|Common Lisp}}
<
(import (srfi 1 lists)) ;; use 'fold' from library
Line 1,935 ⟶ 2,115:
(display " is ") (display (mean-angle angles)) (newline))
'((350 10) (90 180 270 360) (10 20 30)))
</syntaxhighlight>
<pre>
Line 1,944 ⟶ 2,124:
=={{header|Seed7}}==
<
include "float.s7i";
include "math.s7i";
Line 1,973 ⟶ 2,153:
writeln(meanAngle([] (90.0, 180.0, 270.0, 360.0)) digits 4);
writeln(meanAngle([] (10.0, 20.0, 30.0)) digits 4);
end func;</
0.0000
90.0000
Line 1,979 ⟶ 2,159:
=={{header|Sidef}}==
<
atan2(
Math.avg(angles.map{ .deg2rad.sin }...),
Line 1,988 ⟶ 2,168:
[[350,10], [90,180,270,360], [10,20,30]].each { |angles|
say "The mean angle of #{angles.dump} is: #{ '%.2f' % mean_angle(angles)} degrees"
}</
{{out}}
<pre>
Line 1,997 ⟶ 2,177:
=={{header|Stata}}==
<
function meanangle(a) {
return(arg(sum(exp(C(0,a)))))
Line 2,010 ⟶ 2,190:
meanangle((10,20,30)*deg)/deg
20
end</
=={{header|Swift}}==
<syntaxhighlight lang="swift">import Foundation
@inlinable public func d2r<T: FloatingPoint>(_ f: T) -> T { f * .pi / 180 }
@inlinable public func r2d<T: FloatingPoint>(_ f: T) -> T { f * 180 / .pi }
public func meanOfAngles(_ angles: [Double]) -> Double {
let cInv = 1 / Double(angles.count)
let (s, c) =
angles.lazy
.map(d2r)
.map({ (sin($0), cos($0)) })
.reduce(into: (0.0, 0.0), { $0.0 += $1.0; $0.1 += $1.1 })
return r2d(atan2(cInv * s, cInv * c))
}
let fmt = { String(format: "%lf", $0) }
print("Mean of angles (350, 10) => \(fmt(meanOfAngles([350, 10])))")
print("Mean of angles (90, 180, 270, 360) => \(fmt(meanOfAngles([90, 180, 270, 360])))")
print("Mean of angles (10, 20, 30) => \(fmt(meanOfAngles([10, 20, 30])))")</syntaxhighlight>
{{out}}
<pre>Mean of angles (350, 10) => -0.000000
Mean of angles (90, 180, 270, 360) => -90.000000
Mean of angles (10, 20, 30) => 20.000000</pre>
=={{header|Tcl}}==
<
set toRadians [expr {atan2(0,-1) / 180}]
set sumSin [set sumCos 0.0]
Line 2,022 ⟶ 2,232:
# Don't need to divide by counts; atan2() cancels that out
return [expr {atan2($sumSin, $sumCos) / $toRadians}]
}</
Demonstration code:
<
proc printMeanAngle {angles} {
puts [format "mean angle of \[%s\] = %.2f" \
Line 2,032 ⟶ 2,242:
printMeanAngle {350 10}
printMeanAngle {90 180 270 360}
printMeanAngle {10 20 30}</
{{out}}
<pre>
Line 2,040 ⟶ 2,250:
</pre>
=={{header|
<syntaxhighlight lang="vala">double meanAngle(double[] angles) {
double y_part = 0.0;
double x_part = 0.0;
for (int i = 0; i < angles.length; i++) {
x_part += Math.cos(angles[i] * Math.PI / 180.0);
y_part += Math.sin(angles[i] * Math.PI / 180.0);
}
return Math.atan2(y_part / angles.length, x_part / angles.length) * 180 / Math.PI;
}
void main() {
double[] angleSet1 = {350.0, 10.0};
double[] angleSet2 = {90.0, 180.0, 270.0, 360.0};
double[] angleSet3 = {10.0, 20.0, 30.0};
print("\nMean Angle for 1st set : %lf degrees", meanAngle(angleSet1));
print("\nMean Angle for 2nd set : %lf degrees", meanAngle(angleSet2));
print("\nMean Angle for 3rd set : %lf degrees\n", meanAngle(angleSet3));
}</syntaxhighlight>
{{out}}
<pre>
Mean Angle for 1st set : -0.000000 degrees
Mean Angle for 2nd set : -90.000000 degrees
Mean Angle for 3rd set : 20.000000 degrees
</pre>
=={{header|VBA}}==
<
Private Function mean_angle(angles As Variant) As Double
Dim sins() As Double, coss() As Double
Line 2,091 ⟶ 2,299:
Debug.Print Format(mean_angle([{90, 180, 270, 360}]), "##0")
Debug.Print Format(mean_angle([{10, 20, 30}]), "##0")
End Sub</
<pre>0
-90
20</pre>
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<
Module Module1
Line 2,114 ⟶ 2,323:
End Sub
End Module</
{{out}}
<pre>0
-90
20</pre>
=={{header|V (Vlang)}}==
{{trans|go}}
<syntaxhighlight lang="v (vlang)">import math
fn mean_angle(deg []f64) f64 {
mut ss, mut sc := f64(0), f64(0)
for x in deg {
s, c := math.sincos(x * math.pi / 180)
ss += s
sc += c
}
return math.atan2(ss, sc) * 180 / math.pi
}
fn main() {
for angles in [
[f64(350), 10],
[f64(90), 180, 270, 360],
[f64(10), 20, 30],
] {
println("The mean angle of $angles is: ${mean_angle(angles)} degrees")
}
}</syntaxhighlight>
{{out}}
<pre>
The mean angle of [350, 10] is: -2.6644363878955713e-14 degrees
The mean angle of [90, 180, 270, 360] is: -90 degrees
The mean angle of [10, 20, 30] is: 19.999999999999996 degree
</pre>
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./fmt" for Fmt
var meanAngle = Fn.new { |angles|
var n = angles.count
var sinSum = 0
var cosSum = 0
for (angle in angles) {
sinSum = sinSum + (angle * Num.pi / 180).sin
cosSum = cosSum + (angle * Num.pi / 180).cos
}
return (sinSum/n).atan(cosSum/n) * 180 / Num.pi
}
var angles1 = [350, 10]
var angles2 = [90, 180, 270, 360]
var angles3 = [10, 20, 30]
var i = 1
for (angles in [angles1, angles2, angles3]) {
System.print("Mean for angles %(i) is : %(Fmt.f(6, meanAngle.call(angles), 2))")
i = i + 1
}</syntaxhighlight>
{{out}}
<pre>
Mean for angles 1 is : -0.00
Mean for angles 2 is : -90.00
Mean for angles 3 is : 20.00
</pre>
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">include c:\cxpl\codes;
def Pi = 3.14159265358979323846;
def D2R = Pi/180.0; \coefficient to convert degrees to radians
func real MeanAng(A); \Return the mean of the given list of angles
int A;
real X, Y;
int I;
[X:= 0.0; Y:= 0.0;
for I:= 1 to A(0) do
[X:= X + Cos(D2R*float(A(I)));
Y:= Y + Sin(D2R*float(A(I)));
];
return ATan2(Y,X)/D2R;
];
[Format(5, 15);
RlOut(0, MeanAng([2, 350, 10])); CrLf(0);
RlOut(0, MeanAng([4, 90, 180, 270, 360])); CrLf(0);
RlOut(0, MeanAng([3, 10, 20, 30])); CrLf(0);
]</syntaxhighlight>
{{out}}
<pre>
-0.000000000000003
-90.000000000000000
20.000000000000000
</pre>
The second example is interesting because it computes ATan2(0.,0.), which is undefined in mathematics (like division by zero), but the floating point processor in IBM-PC-type computers defines it as zero. The reason -90 gets displayed instead is due to small rounding errors (and another extra-mathematical concept, -0). In fact almost any angle can result because of slight rounding errors as Y and X both approach zero.
=={{header|zkl}}==
<
as:=vm.arglist.pump(List,"toFloat","toRad");
n:=as.len();
Line 2,127 ⟶ 2,431:
.atan2(as.apply("cos").sum(0.0)/n)
.toDeg()
}</
{{out}}
<pre>
Line 2,137 ⟶ 2,441:
20
</pre>
|