以下功能有什么作用?
public static double CleanAngle(double angle) {
while (angle < 0)
angle += 2 * System.Math.PI;
while (angle > 2 * System.Math.PI)
angle -= 2 * System.Math.PI;
return angle;
}
这是它与ATan2一起使用的方式。我相信传递给ATan2的实际值总是积极的。
static void Main(string[] args) {
int q = 1;
//'x- and y-coordinates will always be positive values
//'therefore, do i need to "clean"?
foreach (Point oPoint in new Point[] { new Point(8,20), new Point(-8,20), new Point(8,-20), new Point(-8,-20)}) {
Debug.WriteLine(Math.Atan2(oPoint.Y, oPoint.X), "unclean " + q.ToString());
Debug.WriteLine(CleanAngle(Math.Atan2(oPoint.Y, oPoint.X)), "cleaned " + q.ToString());
q++;
}
//'output
//'unclean 1: 1.19028994968253
//'cleaned 1: 1.19028994968253
//'unclean 2: 1.95130270390726
//'cleaned 2: 1.95130270390726
//'unclean 3: -1.19028994968253
//'cleaned 3: 5.09289535749705
//'unclean 4: -1.95130270390726
//'cleaned 4: 4.33188260327232
}
UPDATE
谢谢大家的回答。对于每个答案,还有另一个问题。
为什么他们会“正常化”这个角度?这是代码的一部分。
double _theta = Math.ATan2(oEnd.Y - _start.Y, oEnd.X - _start.X);
Point oCenter = new Point();
oCenter.X = (int)(_start.X + _distanceTravelled * Math.Cos(_theta));
oCenter.Y = (int)(_start.Y + _distanceTravelled * Math.Sin(_theta));
//'move barrage
this.Left = oCenter.X - this.Width / 2;
this.Top = oCenter.Y - this.Height / 2;
答案 0 :(得分:2)
它在radians中指定一个角度,使其位于[0..2pi]
区间内。 2pi
是一个完整的圆,因此角度x
等于角度x+2pi
,x+4pi
,x+6pi
......
答案 1 :(得分:1)
该方法将角度转换为0..pi * 2范围内的等效角度。
如果只将正值传递给Atan2
方法,则只返回第一象限的角度,即在0..pi / 2范围内。因此,您无需对角度进行标准化。
答案 2 :(得分:1)
以下功能有何作用?
这是一种非常缓慢的强制角度(以弧度表示)从0到2π的写法
为什么他们会“正常化”这个角度?
因为ATan()
返回-π和π之间的角度,他们希望它在0到2π之间。
如果这是唯一使用CleanAngle
的代码,则由于身份而不需要它
Cos(θ) = Cos(θ-2π)
Sin(θ) = Sin(θ-2π)
答案 3 :(得分:0)
将以弧度测量的角度标准化为0到2 Pi的范围。