2010-05-17 53 views
2

我試圖找出一條由兩點定義的直線是否大於或等於90度。下面是我的代碼使用是由兩個點形成的水平距離水平大於45度

bool moreThan90 = false; 
double angle = Math.Atan((double)(EndingLocation.Y - Location.Y)/(double)(EndingLocation.X - Location.X)); 
if (angle >= Math.PI/2.0 || angle <= -Math.PI/2.0) 
    moreThan90 = true; 

難道我這樣做正確或是否有更好的建在淨功能會發現這個?

編輯 - 其實我搞砸了我的問題,我換了45水平不是90.但答案讓我到了一個點,我可以弄明白(真的我只需要指出Atan2)。

+1

你的意思是'點x和y定義的直線與角度大於90度的水平線相交?'如果你這樣做,答案是肯定的(繪製幾個例子來說服你自己),除非這條線是垂直或水平的。這應該引導你改進你的問題。 – 2010-05-17 15:53:40

+0

我知道數學是正確的,我想知道是否有更好的內置函數是更傳播的(我討厭做浮點除法,如果我不需要的話)。 – 2010-05-17 15:55:37

+0

@Scott Chamerlain回顧一下我的答案,如果您每次都使用X軸的水平方向,那麼這個方法可以不需要任何劃分。 – msarchet 2010-05-17 16:02:27

回答

7

一條線,是從水平超過90度都會有EndLocation.x比Location.x較小的x值。

所以你並不需要所有的ATAN廢話,這已經足夠了:

if (EndingLocation.X < Location.X) 
    moreThan90 = true; 

編輯:

似乎OP意味着45度不是90,這意味着上述簡化不再成立。對於這一點,可能會更好地使用ATAN2(如Slaks指出的),但在不使用曬黑的精神:

if (Math.Abs(EndingLocation.X - Location.X) > Math.Abs(EndingLocation.Y - Location.Y) && 
    EndingLocation.X < Location.X) 
    moreThan45 = true; 

請注意,您只需要在第二個檢查,如果你只想線,點右邊

+0

錯了。這比'Atan' – SLaks 2010-05-17 15:57:16

+0

@SLaks更寬容,但它是正確的。假設你使用水平線作爲X軸,並且@Scott Chamberlain表示如果他不需要,他寧願不做浮點分割。 – msarchet 2010-05-17 15:59:51

+0

在投票之前,我建議你想一想 - 或者畫出一張圖。我是對的 – pheelicks 2010-05-17 16:00:48

3

你應該叫Math.Atan2,像這樣:

double angle = Math.Atan2(EndingLocation.Y - Location.Y, 
          EndingLocation.X - Location.X); 

if (Math.Abs(angle) >= Math.PI/2.0) 
    moreThan90 = true; 
3

我不會想象有一個圖書館方法來找到兩個向量之間的角度,你正確地做了這個(數學是正確的)和周圍MSDN和谷歌沒有提供任何東西我快速瀏覽。我會使用SLaks的版本調用Math.Atan方法。

自從您使用「水平」作爲您的平面來確定角度是否大於90度時,需要注意一件有趣的事情。如果endingLocation.x < Location.X,如果從正X軸進行測量,則角度將始終「大於」90度。

編輯: 原來的問題被改爲45度檢查。

下面的部分討論如何做到這一點,而不是根據OP所做的評論做浮點除法。

要了解您是否有45度角,我們知道一些事情,而實際上不需要在點上調用ATan

第一45度角的斜率爲1。因此,如果

Math.Abs((EndLocation.y - location.y)/(EndLocation.X - Location.X)) > 1

您有是> 45度的角度,但是作爲一個45度角的排列在一個圓發生4次。我們需要檢查一些事情。如果EndLocation.X < Location.X那麼角度大於45度。這表示Y軸(90-270)的所有角度。要確定角度是否大於45度,我們只需要知道斜率的絕對值是否大於1.對於以下情況,這總是正確的。

Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X)

所以用if語句下面類似

If (EndLocation.X < Location.X) OrElse (Math.Abs(EndLocation.Y - Location.Y) > Math.Abs(EndLocation.X - Location.X) Then AngleGreaterThan45 = True.

我們可以判斷的角度,而不進行任何浮點計算的需要大於45度。