こちらの続きです。
流用して、4分木る1 - C#ATIA
オリジナルのモートン順序の番号とY軸が逆になってしまう部分ですが、
何となくですが、自分なりの考えです。
番号を求める際、オリジナルのコードではこんな式で計算した後に、
関数に投げています。
// 座標→線形4分木要素番号変換関数 DWORD GetPointElem( float pos_x, float pos_y ) { return Get2DMortonNumber( (WORD)((pos_x-m_fLeft)/m_fUnit_W), (WORD)((pos_y-m_fTop)/m_fUnit_H) ); }
Y軸に関しては
((点のY座標 - 空間の最小位置のY座標)÷ 単位空間のY方向の幅 ) を、少数切捨て
の計算をし、Y方向に最小位置から何番目の空間か? を求めています。
X方向も同じです。つまり、空間の最小位置に近い方にモートン順序の番号の
" 0 " が存在するはずです。 それを考慮するとモートン順序の番号は
こんな感じで出てくるはずなので、前回の計算で合っているように
感じてます。
では何故、オリジナルの説明とY軸が逆方向になるのか? なのですが
恐らくこんな理由だと思います。
2D・3DCADの場合、画面上に表示する際には通常OpenGLが利用されて
います。OpenGLは基本的に右手座標系となっているはずです。
(数学のグラフ等とイメージが一致します)
一方ゲームの場合は、主にDirectXが利用されていると思います。
DirectXの場合は、基本的に左手座標系となっていた記憶があります。
オリジナルのサイトでは、ゲームのための説明を行っているため、左手座標系
でのモートン順序の番号となっているのではないのかな? と感じて
います。
確かExcelのシェイプも、画面右に進むのが +X で、下に進むのが +Y
だった記憶です。(M社、左手座標系が好きなんだな…)
ので、Y軸逆転してますがこのまま進めることにしました。
オリジナルの説明でも
"空間を区別する為のハッシュとして利用"
のような説明になっており、上下レベルのモートン順序の番号の関係も
問題無いと思ってます。
でも、8分木のモートン順序の番号は一致しているんですよね…。
(空間の最小位置が " 0 " で一致してます)