それで、
問題
2 点が 2D 平面上で接続されているかどうかを判断するアルゴリズムについて質問があります。私は持っている:
- 2D ラインの配列。各線は、始点と終点の 2D 点で制限されます。各点は 2 つの要素の単純な配列です。
[x,y]
つまり、各線は次のようになります。['start'=>[X0, Y0], 'end'=>[X1, Y1]]
この線セットに という名前を付けますL
。線は互いに属することができます (つまり、1 つの線が別の線の一部である可能性があります)。1 つの点のみで交差できます。つまり、2D 平面上では制限はありません。ただし、線を点にすることはできません。つまり、線の始点と線の終点を等しくすることはできません。 - 2 点
S
およびE
、つまり配列[Xs, Ys]
および[Xe, Ye]
これで、 からのすべての線L
が平面上に描画されます。次に、S
とE
も描画され、質問に答える必要があります。L の線が交差することなく、S から E に到達できますか? さらに具体的に言うと、どのアルゴリズムが最適でしょうか? 「到達可能」とは、飛行機に からS
への道があり、そこからE
どの線とも交差しないことを意味しL
ます。
サンプル
-ご覧のとおり、サンプルS
では とE
は接続されていません。また、サンプルでは、ある行が別の行に完全に属している場合 (灰色と紫の行) と、ある行が別の行に開始/終了を持っている場合 (緑とバラの行) があります。
私のアプローチ
現在、それを行うための非決定論的多項式 (NP) アルゴリズムがあります。その手順は次のとおりです。
- 線の各ペアの交点をすべて見つけます。
- 最初のステップの点から新しい線のセットを作成します。2 つの線に 1 つの交点がある場合、4 つの新しい線があり、それぞれの新しい線の始点に交点があります。または、最初の線の始点/終点が 2 番目の線にある場合は 3 つの新しい線になります。または、2 つの新しい線になります。最初の行の開始/終了が 2 番目の行の開始/終了と正確に一致する場合の行。すなわち:
したがって、最初のケースは 4 つの新しい行になり、2-4 ケースは 3 つの新しい行に、5 つのケースは 2 つの新しい行になります。(行は[A, B]
と[C, D]
)
- 次に、2番目のステップからラインステップで、すべてのポリゴンを検索しています。ポリゴンは閉じた線のセットです (つまり、領域の閉じた部分を保持します)
S
を含むポリゴンのサブセットを決定していますS
。これを行うために、私は単純なアルゴリズムを使用しています - ポリゴンのエッジとの交差の数とS
外側の平面への線を数えます(奇数の場合S
はポリゴンの内側にあり、偶数の場合は外側にあります)。これはレイキャスティングアルゴリズムです。それから私はそれをしますE
S
ここで、両方にポリゴンを設定し、E
単純に両方のセットを比較しています。それらが等しい場合は、E
から到達でき、到達S
できませんでした-そうでない場合。
なぜこれが NP なのか?
答えは簡単です。3 番目のステップで、2D グラフ内のすべてのループの検索を実行しています。NPの場合、最大/最小ループ長を見つける問題があるため、私のものもそうです(結果のループセットをソートするだけで最大/最小ループ長を取得できるため)。これに関する良い情報はここにあります。
質問
私の現在の解決策はNPであるため、知りたいです-問題に対する私の解決策はやり過ぎでしょうか? つまり、多項式時間になるより単純なソリューションがあるかもしれませんか?