ややプログラム紀行

博士2年のプログラムに関する日記

4分木空間分割

skyrim』をプレイする暇がなくて困ってます・・・

性能の良いパソコンも欲しいなぁ

③座標からの変換

これもまたマルペケつくろーに載ってることですが

自分の理解のためにも書きます

さて、4分木空間分割が処理が軽いと言っても

空間を判別する時に時間をかけてしまっては意味がありません

そこで工夫した処理方法を考えてみます

今、したいこと、つまり理想は『縦のマスと横のマスが分かれば一発で空間レベル、位置がわかる』ということです

まず、親空間しか無いと仮定して話します

左上を原点として、

[0・0] ⇒ 0

[0・1] ⇒ 1

[1・0] ⇒ 2

[1・1] ⇒ 3

となります

ちょうどこんな感じ(めちゃくちゃわかりにくいのであのサイトを見てくださいm(_ _)m )


  0・1 →X

0 0|1

・ ―――

1 2|3


では、『2』に注目してみます

2を2進数で表すと[10]になります

わかる人はもう分かっていると思いますが、この2進数、座標と同じですね!!( [Y、X]と並べたときです )

これはすなわち、2つずつに2進数を分けたとき、左がY座標、右がX座標を表しているといえます(発展していうと、X座標とY座標の数字がお互いに影響が無い、つまり独立しているということです!!!)

これが、ものすごい重要なんです

良く考えたな~って感じです

次に、親空間、子空間、孫空間があったとします

縦、横の長さは8でいいすかね

(さすがにさっきの文字の図はかく気になれません)

じゃあ『38』でもやってみましょう

38を2進数であらわすと[100110]になります

で、こんどは座標の2進数を見ていきましょう

38の座標は[2、5]なので

X軸、つまり2の2進数は[010]

Y軸、つまり5の2進数は[101]

となります

こ、この数字は・・・!!!

カンがいい人は気付いたかもしれません

この2進数を↓こんなかんじで組み合わせると・・・

X軸の2・・・ 0 1 0

Y軸の5・・・1 0 1 

       

あああああぁぁぁっぁぁっぁあ!!!!

[100110]、すなわち38が出てきました!!!

これは先ほど言った、『X座標とY座標の数字が独立している』ということが関係していて、N進数の特性を最大利用している気がします

この作業、細かくやればズバッと解決できます(この下、細かい作業なのでいらない人は飛ばしてください)


細かく、というのは親空間、子空間、孫空間をひとつひとつやっていくということです

親空間での2は0にあたり、5は1にあたります

子空間では2は1、5は0

孫空間では2は0、5は1です

気付きましたでしょうか

2の2進数は[010]でしたが、

1桁目が孫空間、2桁目が子空間、3桁目が親空間に対応しています!

なので、X軸とY軸の2進数列を素直に組み合わせるだけで、座標が指し示す数字、空間の位置がわかるということです!


ってなわけで、座標から位置がわかるようになりました

試しに[4、6]がどこを示しているか考えてみましょう

4・・・[100]

6・・・[110]

組み合わせると・・・

 1 0 0

1 1 0

[111000]を10進数に戻すと・・・『56』と出てきました

これは・・・あってますね!成功です

てなわけで座標から空間を出すのは分かったみたいです

長かった・・・