与えられた:
- (X、Y)座標。これは、車両の位置です。
- ポリラインの頂点である(X、Y)の配列。ポリラインは直線セグメントのみで構成され、円弧は含まれないことに注意してください。
私が欲しいもの:
- 車両がポリラインの左側にあるか右側にあるか(またはもちろん上部にあるか)を計算します。
私のアプローチ:
- すべての線分を反復処理し、各線分までの距離を計算します。次に、最も近いセグメントに対して、単純な左左テストを実行します(たとえばここで説明します)。
考えられる問題:
- 3つのポイントが90度よりも小さい角度を形成する場合(画像のブローに示されているように)、より複雑なシナリオが発生します。以下に示すように、車両が赤いセグメントにある場合、最も近いセグメントは2つのいずれかになります。ただし、左のテストでは、最初のセグメントが最も近いセグメントとして選択された場合は右になり、それ以外の場合は左になります。車両がポリラインから離れているという正しい結果が得られるはずであることが簡単にわかります(少なくとも、私は願っています) 。
私の質問:
- どうすればエレガントに、しかしほとんど効率的にこの特定の状況に対処できますか?
これまでの私の修正:
- 両方のセグメントについて、頂点点から開始して、そのセグメント上の点を計算します。
- ユークリッド距離を使用して、車両から両方のポイントまでの距離を計算します
- 計算されたポイントが最も近いセグメントを保持します。
私はこの修正にあまり満足していません。はるかにエレガントな解決策が欠けているように感じ、私の修正はかなり「ハッキー」に感じます。ただし、効率はリアルタイムの組み込みシステムで使用されるため、重要です。
既存のコードベースはC++であるため、特定の言語で記述したい場合は、C++が私の好みです。ありがとう!
[編集]外向きの法線を計算するよりも線分をたどる方が簡単だと思うので、修正を垂直点から平行点 に変更しました。