質問
私の矩形のすべて同じサイズです。私はランダムに生成ポイント低下するべきではなくこれらの矩形と同じように、いい試合に発生する点にあり、長方形、または新しく生成します。
R-樹木でうなった四角います。使うことがで修理技術のデモンストレーションのR-ツリーのアルゴリズムをポイントももう少しない管理ソリューションを提供輪場合があります。私はあまり知らないとデータ構造くん、ありがとうございまがすでに存在する一部の構造が自分の問題なのか。
概要、基本的にはやっぱりそうであれば誰でも知っての良いアルゴリズムを作ることPythonでチェックに使用された場合点にある任意の矩形に与えられた矩形.
編集:この2次元の矩形のない転させます。
解決
このRedditのスレッドがあなたの問題に対処します:
私は長方形のセットを持っている、との点かどうかを判断する必要がありますそれらのいずれかの内に含まれています。これを行うにはいくつかの良いデータ構造は、高速検索が重要であると、どのようなものがありますか
あなたの宇宙は整数である、または精度のレベルは良く知られており、高すぎない場合は、あなたが使用できる場合は、<のhref =「http://www.reddit.com/user/abelsson」のrel = "nofollowをnoreferrer "スレッドから> abelssonするの提案、着色を用いてO(1)ルックアップを使用して
いつものように、あなたはのためのスペースを取引することができます 時間..ここは非常にとO(1)の検索です 低定数。 INIT:ビットマップを作成します。 すべての矩形を包み込むのに十分な大きさ 十分な精度で、初期化します それを黒に。すべてのピクセルを色付け 任意の矩形白を含みます。 O(1) ルックアップは:点(x、y)が白でありますか?もし そう、矩形がヒットしました。
私は、あなたがそのポストに行くと、完全である ModernRoninするの答えを読むことをお勧めしますほとんどが1を受け入れました。私はそれをここに貼り付けます:
まず、マイクロ問題。あなたは持っています 任意の矩形を回転し、A ポイント。内部のポイントです 矩形?
これを行うには多くの方法があります。しかし 最高のは、私が思うに、2Dを使用しています ベクトル外積。まず、確認してください 四角形の点が格納されています 時計回りためです。その後、ベクトルを行います 1とのクロス積)ベクトル 側の二点によって形成されます 2)最初の点からのベクトル テストポイントに側の。小切手 結果の符号 - 正です 内部側(右側)に、 負外です。それは内部のなら すべての4つの側面は、それは内部のです 矩形。または同等に、それはだ場合 側面のいずれかの外で、それは外です 長方形。 ここをもっと説明ます。
この方法は、あたり3つの減算がかかります ベクトルは、*倍の側につき2つのベクトル、 プラス側につき1つの外積ました 3回の乗算であり、2つが追加されます。 11 サイドあたりのフリップフロップ、44はあたりをプ 長方形ます。
あなたは外積を好まない場合は、 その後、あなたのような何かができます: 把握内接し、 それぞれの外接円 四角形、内側のポイントかどうかを確認 内接1。もしそうなら、それは中です 同様に長方形。そうでない場合、かどうかを確認 それは外接外です 矩形。もしそうなら、それは外です 同様に長方形。それが間にある場合 あなたが**** D Fと、あなたしている二つの円、 それを苦労してチェックする必要があります。
ポイントは円の内側にある場合は、検索 2dに2つの減算と2を取ります squarings(=乗算)、およびその後 距離は避けるように乗比較 平方根を行うに持ちます。それは4です フロップ、2倍の円8であるプ - 時にはあなたはまだ知ることができません。 また、これはあなたが払っていないことを前提としてい 任意のCPU時間を計算します 外接または内接円、 これはよいかによって真ではないかもしれません あなたがしているどのくらいの事前計算上 あなたの長方形のセットにしても構わないと思っています。
いずれにせよ、それはおそらくありません ポイントをテストするための素晴らしいアイデア すべての四角形、特にあなたの場合 それらの億を持っています。
どのマクロの問題に私たちをもたらします。 ポイントをテストしないようにする方法 セット内のすべての単一の矩形?に 2Dは、これはおそらく、 4分木であります 問題。 3Dでは、どのようなgeneric_handle 言った - オクトツリーが。私のトップオフ 頭は、私はおそらくとしてそれを実装し B +ツリーに。それは、D = 5を使用することは魅力的です そのため、各ノード4まで持つことができます 子供たち、それはとてもうまくマッピングしますので、 クアッドツリー抽象概念へ。しかし、もし 長方形のセットがに大きすぎます 非常に可能性はない(メインメモリに収まります これらの日)、その後、ノードました ディスクブロックと同じサイズで、おそらくです 進むべき道ます。
迷惑な縮退に気をつけろ 10を持っているいくつかのデータセットのような場合、 千のほぼ同じ長方形 まったく同じポイントでセンターを持ちます。 :P
なぜこの問題が重要なのですか?それです チェックして、コンピュータグラフィックスに有用 光線は、ポリゴンと交差するかどうかを判定。すなわち、 そのスナイパーライフルはあなたを撮影しました あなたが撮影された人は、ヒット作ら で?また、リアルタイムのマップに使われています ソフトウェアは、のようなGPSユニットを言います。 GPS あなたがにいる座標を伝え、 しかし、地図ソフトはどこ見つけることがあります そのポイントは、マップの膨大な量であります データ、およびそれを数回行うごと 二ます。
ここでも、信用への ModernRoninする ...
他のヒント
た矩形をドメインのそれぞれの軸が必要となります二つのポイント(四番号)の特定矩形-従来の左下と右上隅.確かに与えられた点(X試験, Y試験)と重なりつぶし矩形(XBL, YBL, XTR, YTR)による試験も
- X試験 >=XBL &&X試験 <=XTR
- Y試験 >=YBL &&Y試験 <=YTR
を明確になり、十分な大きさポイントセットの試験ることができるかなり時間がかかります。しかし、どのよう最適化の試験をします。
明確、最適化を確実に検証することができ、最小と最大のXとYの値のボックス周辺の矩形のバウンディングボックス):迅速に試験をおこにあるかを見る必要があります。
- X試験 >=Xmin &&X試験 <=Xmax
- Y試験 >=Ymin &&Y試験 <=Ymax
によってどのくらいの面が矩形されることもありますので、この非重複するサブ領域を含む形の大きますが、それを避ける検索方のサブ地域を含めることはできませんの矩形と重なる点は、保存比較中の検索のコストの計算に適したデータ構造です。場合には設定の矩形が疎でもなうことがあってはならない重複する場合は、この低下に力を検索する同様に、場合には設定の矩形は緻密なサブレンジのバウンディングボックスできる分を壊すことなく、矩.
しかし、このまま任意のバウンディングエリアを、四半期連結累計期間の半分を各方面)だしのリストボックスを含むより箱以上のオリジナルセット(二つのボックスの各ボックスと重なり、任意の境界).に活用することができることを排除を四方からの検索、検索することが可能になっ計のauxilliary保管します。
そう、あの空間-時間の貿易-償却しています。事前計算と検索貿易-ロードします。の場合は生憎の事前計算を実現し何もない(例えば、ある箱のみな重複は軸)。一方、実現には相応の検索時間ます。
私はあなたがBSPツリーに(および可能性四分木またはオクトリ、リンクnoreferrer">
あなたのR-ツリーアプローチは、私の知る最良のアプローチ(R-木はあなたのケースで構築する便利なように見えるとしてそれは私が四分木、B +木、またはBSP木を、オーバー選ぶだろうなアプローチだ)です。警告:私は、アルゴリズムの私のシニア年制大学のクラスからいくつかのことを覚えていても、何の専門家だ。
なぜこれを試してみてください。これは、計算およびメモリの両方にかなり軽いようです。
あなたのスペースのベースライン上にすべての矩形の投影を考えてみましょう。
として行間隔の集合を表します {[Rl1, Rr1], [Rl2, Rr2],..., [Rln, Rrn]}, ordered by increasing left coordinates.
これで、点xを含む行間隔に到達するまで、あなたのポイントは、(x、y)が、このセットの左側に検索を開始するとします。
何も行わない場合は、、あなたのポイント(x、y)は、全ての長方形の外側にある。
いくつかは、...、[RLK、RRK]を言うならば、[RLH、RRH]、(K <= H)をちょうどyはこれらの長方形の任意の垂直範囲内にあるかどうかをチェック。
完了ます。
幸運ます。
ジョンDoner