web-dev-qa-db-ja.com

2つの線分が交差するかどうかを判断しますか?

重複の可能性:
2つの線分が交差する場所をどのように検出しますか?

2つの線分が交差するかどうかを判断するためのアルゴリズムまたはCコードを誰かが提供できますか?

12
user420878

それは本当に線がどのように表現されるかに依存します。それらがパラメトリック形式で表されていると仮定します

- バツ(t)= + t v

- バツ1(t)= 1 + t v1

ここで、x 's、' s、およびv 'sは、ℜのベクトル(さらに太字で示されています)です。2およびt∈[0、1]。

これらの線分の両方にある点がある場合、これらの2つの点は交差します。したがって、ある点がある場合pしたがって、tがあります。

p = x(t)= + t v

とそのようなs

p = x1(s)= 1 + s v1

さらに、両方のs、t∈[0、1]の場合、2本の線が交差します。そうでなければ、彼らはしません。

2つの等式を組み合わせると、次のようになります。

+ t v = 1 + s v1

または、同等に、

--1 = s v1 --t v

=(x00、y00

1 =(x10、y10

v =(x01、y01

v1 =(x11、y11

上記の式を行列形式で書き直すと、次のようになります。

| x00 - x10 |   | x11 |      | x01 |
| y00 - y10 | = | y11 | s -  | y01 | t

これは、行列式と同等です。

| x00 - x10 |   | x11  x01 | | s|
| y00 - y10 | = | y11  y01 | |-t|

ここで、考慮すべき2つのケースがあります。まず、この左側がゼロベクトルの場合、簡単な解決策があります。s= t = 0に設定するだけで、点が交差します。それ以外の場合は、右側の行列が可逆である場合にのみ、固有の解決策があります。させたら

        | x11  x01 |
d = det(| y11  y01 |) = x11 y01 - x01 y11

次に、行列の逆行列

| x11  x01 |
| y11  y01 |

によって与えられます

      |  y01   -x01 |
(1/d) | -y11    x11 |

行列式がゼロの場合、この行列は定義されないことに注意してください。ただし、それが当てはまる場合は、線が平行であり、したがって交差しないことを意味します。

行列が可逆である場合、この行列を左乗算することにより、上記の線形システムを解くことができます。

 | s|         |  y01   -x01 | | x00 - x10 |
 |-t| = (1/d) | -y11    x11 | | y00 - y10 |

              |  (x00 - x10) y01 - (y00 - y10) x01 |
      = (1/d) | -(x00 - x10) y11 + (y00 - y10) x11 |

つまり、これは

s = (1/d)  ((x00 - x10) y01 - (y00 - y10) x01)
t = (1/d) -(-(x00 - x10) y11 + (y00 - y10) x11)

これらの値が両方とも[0、1]の範囲にある場合、2つの線分が交差し、交点を計算できます。それ以外の場合、それらは交差しません。さらに、dがゼロの場合、2つの線は平行であり、関心がある場合とない場合があります。これをCでコーディングすることは、それほど悪くないはずです。ゼロで除算しないように注意する必要があります。

お役に立てれば!誰かが数学を再確認できれば、それは素晴らしいことです。

94
templatetypedef

2本の線に対して equation を作成し、交点を見つけて、それがそれらのセグメントに属しているかどうかを確認できます。

0
gor