コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
姫草ゆうり ◆s3WAgRa4Kkiw
2018/8/26 10:22
質問
最近傍探索について
N個の緑色の点が2次元空間内にランダムに散らばっていたとします。この中に白い点がひとつ混じっていたとします。白い点からみて1番近い緑色の点に白い点を移動させたいです。
N個の緑色の点と白い点との距離を全て計算して、1番短い距離を弾きだせば良さそうですが、これだと緑色の数が多い場合に処理が重くなってしまいます。どうしたら効率よく処理できるでしょうか。

コメント

アバター
hanzo 2018/8/26 11:30 ◆A6odzB/cEbps
SPHITRCを使って、白い点の周囲の適当な大きさの矩形領域内にある緑の点を抽出し、抽出された緑の点についてのみ、距離を計算するようにすれば、処理が重くなるのをある程度防げると思います。
アバター
姫草ゆうり 2018/8/26 12:40 ◆s3WAgRa4Kkiw
hanzoさん

コメントありがとうございます。

白い点の周りに四角い範囲(SPHITRC)を作って、その中に緑色の点(スプライト)があるかどうか調べればよいのですね。

ただ、2次元空間は最大400*240になり、緑色の点に対してスプライトを使用すると管理番号512個では足りなくなってしまいそうです。
できたらスプライトを使用せずに実現させたいです。
アバター
hanzo 2018/8/26 13:24 ◆A6odzB/cEbps
3DSの上画面内に、多数の緑の点が、星空のようにランダムに配置されている様子を想像して間違いないでしょうか?
だとすれば、緑の点はGPSETを使ってグラフィックレイヤーに描画しておき、白い点を起点として、GSPOITを使って、白い点の周囲のグラフィックレイヤーを、渦巻き状に走査して行き、最初に検出された緑の点を、最近傍点と判定する方法が考えられます。
このとき注意すべきは、GSPOITを渦巻き状に走査するときに、重複や抜けがないようにすることですが、このための最適なアルゴリズムは、今すっとは思いつきません。恐縮です。
アバター
姫草ゆうり 2018/8/26 13:58 ◆s3WAgRa4Kkiw
hanzoさん
コメントありがとうございます。

そうです。グラフィック画面で行いたいのです。

まさにhanzoさんのおっしゃる通りのことを、私も考えていました。

白い点を中心として半径Rの円周上の点が、緑色の点と重なったら、探索をやめて移動を開始するというものです。緑色の点が見つからなかったら探索範囲の半径Rは徐々に広げていきます。

こうすると、探索の抜けや重複はあるものの、なんとかスムーズに動きました。(重複についてはなんとか解消できたかも)

ただ今度は白い点が複数個あった場合について、処理が重くなってしまいます。

そこで私はいま、手詰まりな状況にいます。

実は緑色の点がN個、白い点がM個ある場合になんとかして処理落ちせずに動作してほしいんです。

そのために、最近傍探索の処理を効率化したいのです。
アバター
hanzo 2018/8/26 16:09 ◆A6odzB/cEbps
ちょっと自分でも気になったので、お試し版を作ってみました。可能であれば「WJVYQ3HJ」をダウンロードしてみていただけますでしょうか。
本プログラムは、先ほど説明した渦巻き状走査方式に基づいており、白い点の周囲512画素分の円形領域を、内側から渦巻き状に、抜けや重複なく走査して、緑の点を探索します。
本プログラムを実行すると、緑の点を1000個、白い点を16個描画し、それぞれの白い点の最近傍にある緑の点を赤く着色します。左上に表示される数字は、全ての白い点に対する最近傍点の探索にかかる時間[msec]です。私の環境(旧3DS)で試すと、ばらつきはあるものの、最短でも40msec(2~3フレーム)掛かっており、処理落ちしないようにするのは難しそうです。
白い点の数が少ないほど、当然、処理速度は速くなりますし、また、渦巻き状走査方式は、緑の点を検出した時点で走査をスキップするので、緑の点の密度が高いほど(=緑の点の数が多いほど)処理速度が速くなります。
本プログラムの2行目のNとMが、それぞれ緑の点の数と白い点の数ですので、いろいろ変えてお試しください。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -