2 つの 2D ベクトルが与えられた場合、2 番目のベクトルが最初のベクトルの右 (時計回り) にあるのか、左 (反時計回り) にあるのかをどのように判断できますか?
たとえば、これらの図では、B は A の右 (反時計回り) にあります。
A B . .----> A
^ ¬ |\ |
| / | \ |
|/ V \ V
. B A B
2 つの 2D ベクトルが与えられた場合、2 番目のベクトルが最初のベクトルの右 (時計回り) にあるのか、左 (反時計回り) にあるのかをどのように判断できますか?
たとえば、これらの図では、B は A の右 (反時計回り) にあります。
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
ます。が の左側にあるとし
ます。反時計回りに 90 度回転させると後ろに置きます。b
a
b
a
したがって、 の符号は、dot(a, rot90CCW(b))
b が a の右側にあるか左側にあるかを示しますrot90CCW(b) == {x: -b.y, y: b.x}
。
簡単に言うと:
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 はどちら側にあるのですか?」
この定式化では、答えは非常に単純です。例のように、x 座標がゼロの場合、「A」は前方を指します。この仮定では、"B" は、x 座標が正の場合は右側にあり、負の場合は左側にあり、0 の場合はどちらにもありません。
この説明を一般的な位置の「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) にすることを確認します。この方法は、他の回答と同じ算術を使用します。
より深い幾何学的内容が明らかになるように、これを書きました。