0

数学的な重みのあるプログラミングの質問があります。シェイプ(ポリライン)が溺れているマップがあります。その図形の画面座標を取得して、マップ座標に変換したり、逆にしたりできます。マウスの位置をキャプチャして、マップ内を移動しています。マウスを動かしているときに、マップ上で別の形状の溺死に近づいたかどうかをどのように認識できますか? 私は、マウスカーソルの周りに半径のポイントを作成し、一致するために利用可能な形状を常にループすることを考えていました (座標を配列にロードできると思います)。しかし、それは非常に遅いと思います。ポイントは、私が近くにいるとき (たとえば 15 ピクセル)、ミューズの位置をその近くの形状にスナップすることです。助言がありますか?

4

2 に答える 2

1

ここで、本当に完璧にしたい場合は、カーソルから各線分までの距離を計算できます。

各線分 (ポイント D と E で定義)

セグメント DE の行数式を次の形式で計算します。

斧 + バイ + C = 0

A = Dy - Ey

B = Ex - Dx

C = (プラグインポイント D) = -1 * (A * Dx + B * Dy)

カーソル位置を数式に挿入します。

A * cursor.x + B * cursor.y + C = ライン セグメントまでの距離

*一つ - これは無制限の線までの距離です。ここで、2 つのセグメント ポイントの間にいることを確認します。したがって、カーソル、D、E 三角形の角度がすべて < 90 度であることを確認してください。それを行うには多くの方法があります。ドット積の公式を調べて、高速な方法を学びましょう。

角度が 90 未満の場合は、線までの距離を使用します。それ以外の場合は、セグメントのいずれかのポイント (D & E) までの最小距離を使用します。これで、ライン機能への完全なスナップができました。

于 2012-09-04T18:13:16.537 に答える
0

形状のすべてのポイント/ライン セグメントがある場合 (ポリラインを使用する必要があります)、ここに可能な迅速で簡単なルーチンがあります。

各形状について、各構成点を平均して形状の中心を図ります (つまり、五角形の場合、5 つの point.x をすべて加算し、5 で割ります。すべての point.y について同じことを行います)。この平均を shape.x および shape.y と呼びます。距離式を使用して、マウスへの近さを計算します。(Mouse.x - Shape.x)^2 + (Mouse.y - Shape.y)^2... 最も近い形状のみに関心があるため、その平方根を取る必要はありません。

各形状の「二乗」最小距離を追跡します。最小値は、最も近い形状の中心です。

最大範囲で動作にスナップする場合は、距離の 2 乗が < ピクセル距離の 2 乗であることも確認してください。

非常に効率的にしたい場合は、形状の中心を常に再計算する必要はなく、一度計算するだけです。あなたが言及したように、画面空間と他の座標との間で変換している場合、中心は他の点と同じようにスケーリングおよび変換されます。

于 2012-09-04T17:58:53.963 に答える