下面的函数执行什么?
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
}更新
感谢你们所有人的回答。每一个答案都有另一个问题。
为什么他们要将角度“正常化”?这是代码的一部分。
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;发布于 2010-04-10 06:59:40
以下函数执行什么操作?
强制将角度(以弧度为单位)从0写入到2π是一种非常慢的方式
为什么他们要对角度进行“标准化”?
因为ATan()返回-π和π之间的一个角度,而他们希望它介于0和2π之间。
如果这是唯一使用CleanAngle的代码,那么就不需要它了
Cos(θ) = Cos(θ-2π)
Sin(θ) = Sin(θ-2π)发布于 2010-04-09 15:39:57
它对radians中的角度进行规范,使其位于区间[0..2pi]中。2pi是一个完整的圆,因此角度x等于角度x+2pi,x+4pi,x+6pi...
发布于 2010-04-09 15:45:01
该方法将角度转换为范围0..pi*2中的等效角度。
如果只将正值传递给Atan2方法,则只会返回第一个象限的角度,即在0..pi/2范围内。因此,不需要对角度进行标准化。
https://stackoverflow.com/questions/2605771
复制相似问题