web-dev-qa-db-ja.com

2つのラインセグメントが衝突していないかどうかをチェックします(どこにあるかではなく、交差しているかどうかのみチェックします)。

2つの非無限線が交差しているかどうかを確認するための高速アルゴリズムが必要です。それは多くの携帯電話で実行されるため、高速でなければなりません。

アルゴリズムはyesまたはnoを返すだけでよく、線が交差する場所を正確に見つける必要はありません!

私はここを見てきました: 2つの線分が交差する場所をどのように検出しますか? しかし、そのスレッドはジャングルです。これとそのバグの。

これに適した有効なアルゴリズムを見つけるのを手伝ってください。

明確にするために:私はあなたが与える機能が必要です...
lineApointAx
lineApointAy
lineApointBx
lineApointBy
lineBpointAx
lineBpointAy
lineBpointBx
lineBpointBy
... 2つの線が交差するかどうかに応じて、trueまたはfalseを返します。

数式ではなく(疑似)コードで回答していただければ幸いです。

23
Mike

1つのセグメントの2つの端が他のセグメントの異なる側にあり、逆もまた同様です。ポイントがどちら側にあるかを判断するには、クロス積を取り、それが正か負かを確認します。

(Bバツ -Aバツ)(Py -By)-(By -Ay)(Pバツ -Bバツ

編集:
詳しく説明するには、2つの線分[AB]と[CD]を見ているとします。 ((AとBが[CD]の異なる側にある)および(CとDが[AB]の異なる側にある)場合にのみ、セグメントは交差します。

2つの点PとQが線分セグメントの異なる側にあるかどうかを確認するには[EF]、PとQの2つの外積を計算します。

(Fバツ -Eバツ)(Py -Fy)-(Fy -Ey)(Pバツ -Fバツ

(Fバツ -Eバツ)(Qy -Fy)-(Fy -Ey)(Qバツ -Fバツ

結果が同じ符号(両方とも正または両方とも負)の場合は、それを忘れて、ポイントは同じ側にあり、セグメントは交差しません。一方が正で他方が負の場合、ポイントは反対側になります。

47
Beta

与えられた2つの点が(X1、Y1)と(X2、Y2)である場合、両方がセグメントではなく無限の線であると想像してください。

  1. 両方の式を決定します(参照: http://en.wikipedia.org/wiki/Linear_equation#Two-point_form

  2. 2本の線の交点を決定します(以下を参照してください: http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html

  3. X1 <交点X <X2およびY1 <交点Y <Y2の場合、はい、セグメントは交差します。

9
Jonathan M