2010-04-22 105 views
1

我在一個屏幕座標空間中工作,它不同於經典的X/Y座標空間,其中我的Y方向在正向下降,而不是向上。C#矢量數學問題

我也試圖弄清楚如何讓我的屏幕上的圓始終背離屏幕的中心點。

如果我的屏幕的中心點在x(200)y(300)並且我的圓心的點在x(150)和y(380),那麼我想計算圓的角度應該面對。

目前,我有這樣的:

 Point centerPoint = new Point(200, 300); 
     Point middleBottom = new Point(200, 400); 

     Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y); 

     Vector vectorOfCircle = new Vector(centerPoint.X - 150, centerPoint.Y - 400); 

     middleVector.Normalize(); 
     vectorOfCircle.Normalize(); 

     var angle = Math.Acos(Vector.CrossProduct(vectorOfCircle, middleVector)); 

     Console.WriteLine("Angle: {0}", angle * (180/Math.PI)); 

我不是得到什麼我期望的那樣。

我會說,當我在我的圈子的x(150)和y(300)中輸入時,我期望看到90度的旋轉,但我沒有得到那個...我得到180!

在這裏的任何幫助將不勝感激。

乾杯, 馬克

+0

圓圈如何面向方向?它具有∞倍的徑向對稱性。此外,你不斷改變圓的中心。是(150,380),(150,400)還是(150,300)? – outis 2010-04-22 07:15:37

回答

1

它的好,我想我現在弄明白了:

我讀這篇文章:

http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

這確定了我需要使用ATAN2,而不是ACOS

 Point centerPoint = new Point(200, 300); 
     Point middleBottom = new Point(200, 400); 

     Vector middleVector = new Vector(centerPoint.X - middleBottom.X, centerPoint.Y - middleBottom.Y); 
     Vector vectorOfCircle = new Vector(centerPoint.X - 250, centerPoint.Y - 300); 

     middleVector.Normalize(); 
     vectorOfCircle.Normalize(); 

     var angle = Math.Atan2(vectorOfCircle.Y, vectorOfCircle.X) - Math.Atan2(middleVector.Y, middleVector.X); 

     Console.WriteLine("Angle: {0}", angle * (180/Math.PI)); 
+0

+1對! Atan2是一個非常有用的功能,幾乎沒有人知道它。 – 2010-04-22 14:07:35

+0

我更喜歡'var angle = Math.Acos(dotProduct)'。在數學背景少的情況下,理解起來更容易,效率也更高(如果你挑剔的話)。減法不可交換,這意味着當使用Math.Atan2(通常需要檢查)時,會得到負值和/或非標準化> 2pi的角度。如果這不是您想要的,即您總是希望兩個矢量之間的最小角度,請使用點積。 – 2012-09-10 09:51:14

+0

正如我現在看到的,實際上在你的例子中使用點積是沒有意義的,因爲對於像面對類似的東西我會依賴負面的角度。所以'var angle = Math.Asin(crossProduct)'會比Math.Atan2解決方案更好地爲您提供帶符號的角度,因爲您不必檢查> 2pi的角度。 – 2012-09-10 09:53:18

0

不,這是正確的。零角度從原點(中心點)向右。由於圓是在origo的左邊,所以角度是180度。

1

一條評論:

cos-sinus函數用於點乘積中。 Cross產品使用竇。

+0

這會有什麼影響? – Mark 2010-04-22 23:09:19

+1

您在代碼中使用Acos代替Asin或錯誤類型的矢量產品。仔細看看這一行:var angle = Math.Acos(Vector.CrossProduct(vectorOfCircle,middleVector)); – 2010-04-23 01:30:51