9

2 つの 2D ベクトルが与えられた場合、2 番目のベクトルが最初のベクトルの右 (時計回り) にあるのか、左 (反時計回り) にあるのかをどのように判断できますか?

たとえば、これらの図では、B は A の右 (反時計回り) にあります。

A   B   .       .----> A
^  ¬    |\      |   
| /     | \     |  
|/      V  \    V 
.       B   A   B
4

4 に答える 4

39

これは、内積を使用して実現できます。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かどうかを示します。ab


bの右側にあると仮定しaます。b反時計回りに 90 度回転すると、 の前に配置されaます。が の左側にあるとし
ます。反時計回りに 90 度回転させると後ろに置きます。baba

したがって、 の符号は、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")
于 2012-11-04T19:11:07.507 に答える
1

@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) にすることを確認します。この方法は、他の回答と同じ算術を使用します。

より深い幾何学的内容が明らかになるように、これを書きました。

于 2012-11-06T14:19:16.487 に答える