このコードは、AB と CD の 2 つのセグメントの交点を見つけようとします。
これらの操作をどのように解釈するかに応じて、それがどのように行われているかを説明するさまざまな方法があります。
点 A の座標が (xa, ya)、B - (xb, yb) などであるとします。まあ言ってみれば
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
次の 2 つの線形方程式系
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
t
とについて解けば、ライン AB (値) とライン CD (値)u
上の交点の比例位置が得られます。これらの値は、ポイントが対応するセグメントに属している場合は の範囲内にあり、ポイントがセグメントの外側 (セグメントを含むライン上) にある場合はその範囲外にあります。t
u
[0, 1]
この連立一次方程式を解くために、よく知られているCramer の規則を使用できます。そのためには、行列式が必要です
| dxAB dxCD |
| |
| dyAB dyCD |
これはまさにdeterminant(b - a, c - d)
あなたのコードからのものです。(実際にはdeterminant(b - a, d - c)
、ここにあるのは ですが、この説明の目的にとってはそれほど重要ではありません。投稿したコードは、何らかの理由で C と D を交換しています。以下の PS ノートを参照してください)。
また、行列式も必要になります
| xc-xa dxCD |
| |
| yc-ya dyCD |
これはまさにdeterminant(c-a,c-d)
あなたのコードからのものであり、
| dxAB xc-xa |
| |
| dyAB yc-ya |
これはまさにdeterminant(b-a,c-a)
です。
Cramer の規則に従ってこれらの行列式を分割するt
とu
、 と の値が得られます。これは、投稿したコードで行われていることとまったく同じです。
次に、コードは と の値をテストしt
、u
セグメントが実際に交差しているかどうか、つまり と の両方が範囲t
にu
属しているかどうかを確認し[0, 1]
ます。もしそうなら、それは評価することによって実際の交点を計算しますa*t+b*(1-t)
(同等に、それは を評価することができc*u+d*(1-u)
ます)。(繰り返しますが、以下の PS ノートを参照してください)。
PSc - d
元のコードでは、ポイント D と C は、コードが行うという意味で「交換」されていd - c
ます。しかし、符号に注意している限り、これはアルゴリズムの一般的な考え方には何の違いもありません。
a*(1-t)+t*b
この C 点と D 点の交換も、交点を評価するときに式が使用される理由です。通常、私の説明のように、そこに何かが表示されると予想されますa*t+b*(1-t)
。(ただし、これについては疑問がありa*t+b*(1-t)
ます。あなたのバージョンでもそこにあると思います。バグである可能性があります。)
PPSコードがチェックを忘れたdet == 0
(または 0 に非常に近い) 場合の作成者。これは、セグメントが並列である場合に発生します。