1

私は自分の数学が少しさびていることを認識しました..かどうかを確認したいPoint C is between Point A and Point B. C は、A と B の線分上にある場合とない場合があります。3 つのケースが考えられ、すべてを特定する必要があります。

  • C は A と B の間にある

       C  
      / \  
     A---B
    
  • C は A と B の前にある

    C  
     \  \
      A--B
    
  • C は A と B の後ろにある

           C  
       /  /
      A--B 
    

最後の 2 点の「スケッチ」は三角形である必要があります。

ドット積を使用して、C が A と B の間にあるかどうかを確認しました。

if (VectorOf(AB) * VectorOf(BC)) >= 0)

C が A と B の後ろにあるかどうかを確認するには、次を使用します。

if (VectorOf(AB) * VectorOf(BC)) < 0)

しかし、C が A と B の前にあるかどうかを識別する方法は?

4

4 に答える 4

3

点 B から始まる内積を使用するだけです。

if (VectorOf(AC) * VectorOf(AB) < 0) {
    // C is on the left of A
}
else {
    if (VectorOf(BC) * VectorOf(BA) < 0) {
        // C is on the right of B
    }
    else {
        // C is between A and B
    }
}

または、ベクトル AB を基準にして投影距離を計算できます。

(VectorOf(AC) * VectorOf(AB)) / (VectorOf(AB) * VectorOf(AB))

以下の数学に示すように、結果は < 0、0 と 1 の間、または 3 つのケースで > 1 になります。

      C
     /│
    / │
   /  │
──A── H ─────B─────

内積の定義は、

AC · AB = AC×AB×cos(Â) = AH×AB (signed : C が A の左にある場合は負、C が右にある場合は正)。

ABAB=AB²(正)

除算の結果は、符号付き比率 AH/AB です。

-   0          1   >1
────A── H ─────B─────
于 2013-08-11T12:32:49.730 に答える
0

座標を使用するのはどうですか:

Between: a.x > c.x > b.x || a.x < c.x < b.x
Front: c.x < a.x && b.x
Back: c.x > b.x && a.x
于 2013-08-11T12:25:55.033 に答える
0

これは図が示唆するものですが、A、Bは必ずしも同じY座標を持っているとは限りません。ベクトル射影を使用したいと思うでしょう。

let b = B - A,c = C - Aの場合、投影は次のようになります: u = dot(b,c) / |b|,

フロント:u < 0; 間: 0 <= u <= |b|; 戻る: |b| < u.

または: u = dot(b,c) / dot(b,b)

フロント:u < 0; 間: 0 <= u <= 1; 戻る:1 < u

于 2013-08-11T12:34:38.847 に答える
0

あなたの定義では、角度CABとABCが両方とも鋭角の場合、点CはAとBの「間」にあり、ABの前は角度CABが鈍角であり、角度ABCが鈍角の場合はABの後ろにあるようです。

内積を使用して、角度が鋭角か鈍角かを調べることができます。XYZ が鋭角の場合、XY・YZ の doc 積は負であり、鈍角の場合、内積は正です。

于 2013-08-11T12:35:01.123 に答える