読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

流用して、4分木る 2

こちらの続きです。
流用して、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 " が存在するはずです。 それを考慮するとモートン順序の番号は
f:id:kandennti:20170112175006p:plain
こんな感じで出てくるはずなので、前回の計算で合っているように
感じてます。


では何故、オリジナルの説明とY軸が逆方向になるのか? なのですが
恐らくこんな理由だと思います。

2D・3DCADの場合、画面上に表示する際には通常OpenGLが利用されて
います。OpenGLは基本的に右手座標系となっているはずです。
(数学のグラフ等とイメージが一致します)

一方ゲームの場合は、主にDirectXが利用されていると思います。
DirectXの場合は、基本的に左手座標系となっていた記憶があります。

オリジナルのサイトでは、ゲームのための説明を行っているため、左手座標系
でのモートン順序の番号となっているのではないのかな? と感じて
います。
確かExcelのシェイプも、画面右に進むのが +X で、下に進むのが +Y
だった記憶です。(M社、左手座標系が好きなんだな…)

ので、Y軸逆転してますがこのまま進めることにしました。
オリジナルの説明でも
"空間を区別する為のハッシュとして利用"
のような説明になっており、上下レベルのモートン順序の番号の関係も
問題無いと思ってます。


でも、8分木のモートン順序の番号は一致しているんですよね…。
(空間の最小位置が " 0 " で一致してます)