1

長方形、線、円を含む概略図を描画するアプリケーションを作成しようとしています。ここで、長方形を別の位置にドラッグする別の機能を追加したいと思います。私が直面している問題は、長方形内をクリックしたかどうかを検出することです。のような機能があることは知っていますRectangle.Contains(Point)。このような方法を使用するには、for ループを使用して各四角形をチェックする必要があります。多数の長方形が存在する場合、この方法を使用するのは賢明ではありません。このタスクを実行する他の方法はありますか。

4

4 に答える 4

3

コンピュータ グラフィックスの教科書が必要です。これと同様の問題がよく議論されます。

メモリが役立つ場合は、ポイントが長方形の上端の下、下端の上、右端の左、左端の右にあることを確認してください。

ループ内の一連の長方形のテストについて。各長方形が収まる円、境界円を持つことを検討してください。最初に、ポイントが円の半径よりも円の原点から離れているかどうかを確認します。その場合、長方形をテストする必要はありません。それはミスです。OK、それは非常に理論的な答えでした。実際には、ポイントから原点までの距離の計算は非常にコストのかかる計算になる可能性があります。これには平方根が含まれます。四角形チェックでポイントの 4 つの比較を行う方が高速な場合があります。繰り返しになりますが、メモリサーバーが私をサーバーにする場合、原点からの距離が半径よりも大きい場合にのみ、それが何であるかはあまり気にしません。そのため、最後の平方根を省略して距離計算を部分的に実行し、半径の 2 乗と比較します。また、境界円と長方形の両方のチェックを行うことになるヒットをオフセットするのに十分なミスがあることを確認する必要があります。

于 2012-07-26T05:36:10.163 に答える
1

マウスがどの長方形にあるかをすばやく見つけるには、空間インデックスを使用する必要があります。R ツリーをお勧めします。理論的な部分は次のとおりです。

http://en.wikipedia.org/wiki/R-tree

そして、c# の実装:

http://sourceforge.net/projects/cspatialindexrt/

rtee を作成し、長方形を追加してから、マウス座標を使用して rtree.nearest メソッドを呼び出し、マウス カーソルを含む長方形を認識します。距離パラメータで遊ぶことができます。

それが役に立てば幸い、

アンベン・パングロース。

于 2014-09-30T20:04:36.600 に答える
0

表示領域を象限に分割します。次に、長方形を左上、右上、左下、右下のグリッドに配置します。それらを配置するとは、象限ごとにリストを作成し、その中に長方形を配置することを意味します。

ポイントをクリックしたら、それが属する四半期を特定し、それらの長方形のみを検索します。このアプローチにより、線形検索が 4 分の 1 に削減されます。

ポイントが多くの長方形に属する可能性がある場合は、オーバーラップにも注意する必要があることに注意してください。ここでは、長方形の z オーダーが重要です。そのため、リストは象限に対して維持されますが、z オーダーをキーとしてソートする必要があります。

お役に立てれば。

于 2012-07-26T05:11:57.397 に答える