2012-11-04 40 views

回答

24

您可以使用點積實現這一目標的權利。 dot(a, b) == a.x*b.x + a.y*b.y可以用來找到矢量是否是垂直:

var dot = a.x*b.x + a.y*b.y 
if(dot > 0) 
    console.log("<90 degrees") 
else if(dot < 0) 
    console.log(">90 degrees") 
else 
    console.log("90 degrees") 

換句話說。 dot > 0告訴你a是否在「b」的前面。


假設b是對a權。逆時針旋轉b 90度將其放在a的前面。
現在假定b位於a的左側。逆時針旋轉b 90度將其放在a之後。

因此,dot(a, rot90CCW(b))的符號告訴你b是否在右側或左側,其中rot90CCW(b) == {x: -b.y, y: b.x}

Simplyifying:

var dot = a.x*-b.y + a.y*b.x; 
if(dot > 0) 
    console.log("b on the right of a") 
else if(dot < 0) 
    console.log("b on the left of a") 
else 
    console.log("b parallel/antiparallel to a") 
+0

我應該指出如果你按照給定的'A'和'B'的例子,並且看看'-A'和'-B',以便每個指向相反的方向,則-B在-A的左側。但點積是相同的,這意味着你的代碼給出了相反的答案。您定義問題的方式,您的答案不僅僅是點積的標誌。 – eh9

+1

@ eh9;不,如果你反轉,B仍然應該在右邊。我想這個問題是「如果A點向前,它的哪一邊是b」 – Eric

1

在澄清從@Eric註釋,「?如果A點向前,其中它一邊是B關於」

在這個公式中,答案是非常簡單的。正如例子中的「A」所指出的那樣,當它的x座標爲零時。有了這個假設,「B」在x座標爲正時位於右側,負時爲左側,零時也不是。

在一般位置上將此說明擴展爲「A」意味着引入新的座標系,如下所示:「在A點向前的座標系中......」。最簡單的新座標系是基矢爲A(1,0)的座標系。 (如果A是(1,0)的倍數,那麼它只是基本情況的90度旋轉。)座標變換爲L : P = (P_x, P_y) --> P' = (P'_x, P'_y) = (A_y * P_x - A_x * P_y, P_y)。這種線性變換被稱爲偏斜變換。該測試是座標P'_x的符號。檢查L是否將A帶到新座標系中的向量(0,1)。此方法使用與其他答案相同的算術。

我寫了這個,以便更深的幾何內容可以照亮。

-1

@Eric當矢量大小變化很大時,您的點積存在一個基本問題。

var dot = a.x * -b.y + a.y * b.x;

如果(2,-2)和b(-500,-500)清楚地B是上的左側,但這樣做的點積談到大於0

+0

歡迎來到Stack Overflow。你應該考慮在評論中提出這個答案,因爲這部分是評論。否則,你應該整理它並使其成爲完全可用的答案。 –

+0

我試過了,但是用不到50代表.. – Gab

+0

不,b在這裏的右邊(順時針方向),假設一個右手座標系 – Eric

相關問題