C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ボクセルの分割レベル

もう完成してしまったので、公開しちゃおうかなぁ・・・。

ボクセル化する際のダイアログに "分割レベル" があるのですが、
説明が不足しすぎているので補足です。

指定したソリッドボディに対してXYZ方向に最小サイズのブロックを
測定します。
立方体としたい為、XYZの最大長さを1辺とする立方体をベースのブロック
とします。

コマンドでは実行出来ませんが、これを分割レベル "0" とします。

ベースブロックをXYZの半分の位置でぶった切ると8個のブロック
に分かれます。これを分割レベル "1" とします。

この各ブロックに対して結合-交差(ブーリアンの積)を使い
必要なブロックかどうかを判断しています。

分割レベルが増えるとブロックが激増します。(べき乗です)

8 ^ 分割レベル

です。

デフォルトは "3" としていますが、8^3=512です。
推奨値を "5" 以下としていますが、8^5=32768の為、総当たり
では、とても処理時間がかかります。
そこで、この8個に分けるやり方が役立ちます。


分割レベル "2" を設定した場合で説明します。
まず分割レベル "1" を行います。

赤印部分は全く元の形状に関係ないブロックになります。
その為レベル "2" に分割し干渉するチェックを行う必要
無くなり、大幅に処理量を減らす効果があります。(多分・・・)

この手法は8分木(オクトツリー)と呼ばれているものです。
八分木 - Wikipedia

平面的なベン図っぽく表現すると、

青色が分割されたブロックだとすると、上の状態は無関係の為
これ以上分割・チェックは必要ありません。


こちらも、これ以上処理を行っても、干渉状態となる為
これ以上分割・チェックは必要ありません。


こちらはさらに小さく出来る可能性がある為、
さらに分割する価値がありますね。

と素直に実装したのですが、最終レベルの1個手前では
元の体積が7/8以上ある場合は、分割しなくても良い様な
気もしてきた・・・。


”程よく分割して欲しいのに” と言うご意見もあるとは
思うのですが、以上の方法が割と効率良く処理時間短め
となるので、お許しいただきたい。

オクトツリーについては、こちらでかなり学びましたが
今回はモートンオーダーについては利用していません。
その15 8分木空間分割を最適化する!