給定兩個2D矢量,如何判斷第二個是在第一個還是在左邊?確定一個2D矢量是否在另一個的右邊或左邊
例如,在這些圖B是對的
A B . .----> A
^ ¬ |\ |
|/ | \ |
|/ V \ V
. B A B
給定兩個2D矢量,如何判斷第二個是在第一個還是在左邊?確定一個2D矢量是否在另一個的右邊或左邊
例如,在這些圖B是對的
A B . .----> A
^ ¬ |\ |
|/ | \ |
|/ V \ V
. B A B
您可以使用點積實現這一目標的權利。 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")
在澄清從@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)。此方法使用與其他答案相同的算術。
我寫了這個,以便更深的幾何內容可以照亮。
我應該指出如果你按照給定的'A'和'B'的例子,並且看看'-A'和'-B',以便每個指向相反的方向,則-B在-A的左側。但點積是相同的,這意味着你的代碼給出了相反的答案。您定義問題的方式,您的答案不僅僅是點積的標誌。 – eh9
@ eh9;不,如果你反轉,B仍然應該在右邊。我想這個問題是「如果A點向前,它的哪一邊是b」 – Eric