2010-04-09 159 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。因此,您不需要對角度進行標準化。