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

C#ATIA

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

端点一致を探る、組み合わせテスト7

こちらの続きです。
端点一致を探る、組み合わせテスト6 - C#ATIA


一ヶ所だけバグを発見しました。


こちらのコードですが
端点一致を探る、組み合わせテスト3 - C#ATIA

GetPointElem関数内のGet3DMortonNumber関数を利用する際の引数部分の
計算式を

CByte((p(0) - rgnMin(0)) / unit(0))

こんな風にしていました。 細かな事は抜きにしてオリジナルのコードとしては、
"計算値の値の小数点以下を切り捨てる" 事をやっており
それをVBA化したつもりでした。

前回の座標値(9,9,9)の場合は、結局

CByte((9 - (-10)) / 5)

と言う処理になります。これをイミディエイトウインドウで計算させると

?CByte((9 - (-10)) / 5)
 4 

ん? 電卓でも計算できますが、キャスト(型変換)を除いた結果を見ると

?(9 - (-10)) / 5
 3.8

切り捨ててないじゃないですか。 長年キャストは切り捨てだと思い込んでました。

無い知恵絞って、商を取れば良いんだな と思いこのようにしましたが

?((9 - (-10)) / 5)\1
 4 

商、お前もか!

調べて見るとIntとFixと言うのがあるんですね、知りませんでした。
【VB6/VBA】数値を切り上げ/切り下げする - オープンリファレンス
負の数が必要かどうか確認していませんが、

?Fix((9 - (-10)) / 5)
 3 

これなら正しいです。GetPointElem関数をとりあえずFixに直すと
f:id:kandennti:20161219123953p:plain
座標値2 モートン順序 "63" で正しいです。 ボリューム時のインデックスNoは
まだ直っていませんが。 ・・・こんなレベルから戦うのはシンドイなぁ。


※追記です
コメント頂いた分の画像です。
f:id:kandennti:20161219142448p:plain