3

ラインストリングをポイントのリストと考えてみましょう。私はそれをトレイルと名付けました。このトレイルに十分近いポイントを検出する必要があります。私は興味ポイントと呼ばれる別の線ストリングを持っています。これは、トレイル ラインストリングから最も近いインデックス ポイントを返す必要があります。これらの関心点はトレイル ラインストリングに含まれていないので、関心点を与えることで、このトレイルのインデックス ポイントを何らかの方法で評価します。結果の関心ポイントは、トレイル リストに存在する値を取得します。

ここに画像の説明を入力

[編集]:

この問題を単純な数値を使用して変換します。それは簡単だと思います。

入力リスト [0.5、1、1.5、2、2.5、3、3.5、4、4.5、5]。入力番号: 3.30

その条件を簡単に確認できます: list[n] < number < list[n+1] 次に、コストを確認できます。

コスト 1 = 数値 - リスト [n] コスト 2 = リスト [n+1] - 数値。

次に、(cost1 < cost2) が N を返す場合、N のインデックスを取得できます。それ以外の場合は、N+1 を返します。

[重要]:

点オブジェクトは数値として比較できないため、盲点になります。

4

1 に答える 1

1

これを一度だけ行う必要がある場合、または速度があまり重要ではなく、トレースがループバックする傾向がなく、最も近い 2 つのポイントを検出することと、それらの間の線分を検出することとが異なる場合は、非常に簡単です。

まず、点の距離の二乗式が必要です (これは単純な数値の差の代わりになります)。

 def dSq(x0: Double, y0: Double, x1: Double, y1: Double) =
   (x1 - x0)*(x1 - x0) + (y1 - y0)*(y1 - y0)

余分な平方根を計算する必要があることを除いて、距離の 2 乗よりも単純な距離を使用しても実際の利点はないことに注意してください。def d(...) = sqrt(dSq(...))(ただし、代わりに自由に使用してください。)

これで、トレースからターゲット ポイントまでの距離がわかりました。

 val ds = trace.map(p => dSq(target.x, target.y, p.x, p.y))

そして、点のペア間の距離を見つけます。

 val pairDs = ds.sliding(2).map(xx => xx(0) + xx(1))

そして、これらのうち最小のもののインデックスを見つけます。

 val smallest = pairDs.min
 val index = pairDs.indexWhere(_ == smallest)

次に、元のリストでは、2 つのポイントはindexindex+1です。

または、最も近い単一のポイントを見つけてから、それらの距離を比較して、次または前のポイントが必要かどうかを決定することもできます。(繰り返しますが、これらはすべて不正確であることに注意してください。実際に正しく行うには、2 点間の線分への点の最接近点を計算する必要があり、これはより長い式です。)

これを何度も行う必要がある場合は、関係のない大きな距離を無視するためのより高速な方法が必要になります。一般的な方法の 1 つは、トレース上にグリッドを配置し、各グリッド要素内にサブトレースを作成することです。次に、関心のあるポイントが与えられたら、まずそのグリッドの位置を調べてから、グリッドのすぐ内側で同じ検索トリックを実行します。(グリッド内のポイントをクリップする方法によっては、隣接する 8 つの隣接ポイントも検索する必要がある場合があります。)

于 2015-06-21T20:24:45.197 に答える