2010-04-09 228 views
0

以下功能执行什么功能?帮助了解功能

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; 

回答

1

下面的函数执行什么?

它从0写入到2π

强制的角度(弧度)的一个非常缓慢的方式,他们为什么会成为“正常化”的角度?

因为ATan()返回-π和π之间的角度,他们希望它在0和2π之间。

如果是使用CleanAngle唯一的代码,那么它是没有必要的,因为身份

Cos(θ) = Cos(θ-2π) 
Sin(θ) = Sin(θ-2π) 
+0

非常感谢你的。你的“身份”很好地解释了这一点。 – 2010-04-10 20:37:07

2

它规范radians一个角度,使得它在时间间隔[0..2pi]2pi是一个完整的圆,因此角度x等于所述角度x+2pix+4pix+6pi ...

0

它规范化以弧度为单位成范围为0〜2裨的角度。

1

该方法将一个角度转换为0..pi * 2范围内的等效角度。

如果您只将正值传递给Atan2方法,则只会返回第一个象限的角度,即范围为0..pi/2。因此,您不需要对角度进行标准化。