私は現在、ユーザーがJavaの画面上にグラフ(頂点/エッジ)を作成できるようにするペットプロジェクトに取り組んでいます。頂点はJComponentsとして実装されていますが、エッジはLine2Dとして実装されています。ユーザーがキャンバス上でマウスを動かしているときに、エッジ(またはLine2D)の1つに近接する特定のしきい値内にある場合、そのエッジ(マウスに最も近い)が強調表示されます。
私の質問は、どのエッジがマウスに最も近いかを実装する方法を扱っています。現在、動きを検出するマウスリスナーがあります。マウスを動かすたびに、プログラムはすべての行(エッジ)を循環し、Line2DのptDistSeg()関数を使用して最も近い行を決定します。これがしきい値内にある場合は、強調表示されます(paintcomponentで太いストロークを使用)。
マウスを動かすたびにマウスからのすべてのエッジ距離を再計算する必要があるため、これは非常に非効率に思えます。頂点の場合、マウスリスナーが各頂点に関連付けられているため、これは問題ではありません。したがって、頂点は、イベントを処理する必要があるタイミングを認識しています。残念ながら、エッジは、mouseListenerを実装できないLine2Dとして表されているため、これを行うことはできません。
それで、最も近いエッジを見つけるためのより効率的な方法はありますか、それとも別の方法でエッジを実装する必要がありますか?
ありがとう。
これにはおそらくどこかでより良いデータ構造がありますが、1つのオプションは、各エッジの軸に沿った境界ボックスを計算してエッジごとに1つの長方形を取得し、これらの長方形すべてをRのような空間データ構造に格納することです。-ツリー。Rツリーは、「ある点に重なるすべての長方形を表示する」という形式の効率的なクエリをサポートしているため、これを使用して、すべての線分をマウスポイントに当たる可能性のある線分だけに絞り込み、テストすることができます。
ここでの欠点は、境界ボックスを変更するコストのためにノードを移動するために多くのRツリーを再構築する必要があり、Rツリーは非常に簡単ではないため、適切なRツリーライブラリを見つける必要があることです。ゼロから実装します。
お役に立てれば!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加