C#ATIA

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

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

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


忙しいので進められる状態では無いのですが、考えもまとまらない為
コード無しです。

最初は端点同士の比較の為、空間を跨ぐ事は無いなぁ と考えていました。
今回の様に数値を比較する際、イコールで一致を判断するのはちょっと
まずかったりします。特に実数の場合は。
その為トレランスを導入するのですが、この扱いに悩んでます。

組み合わせ数を減らす為空間を分割し、基本的に同一空間と最上位のまでの
親空間との一致を見るだけで済むようになるのですが、極端な表現をすれば
同一レベルの隣の空間との一致は見ないことになります。
そうなると困るのがトレランスの扱いでした。

f:id:kandennti:20161221193004p:plain

赤いラインは空間の境界ラインです。こんな感じで隣り合った空間に
トレランス以内の距離で端点があると、本来 " 一致する " と判断されるべき
ものが、空間が異なる為に一致を検証されなくなってしまいます。

f:id:kandennti:20161221193013p:plain

そこで思いついたのが、端点を重心とし一辺を トレランス X 2 とした
立方体を想定しモートン順序を求めようと考えました。点なのにボリュームで
モートン順序を求めようとしたのは、これが理由なんです。
本来なら、各空間の境界をトレランス分広げてモートン順序を求められると
効率良いだろうと思うのですが、僕の知識ではどの様な計算式にすれば
良いのかわかりませんでした。言葉じゃ表現しにくいのですが・・・。

トレランスやデータの状態によって何とも言えませんが、これに引っかかる
要素は恐らく少ない気がするのですが、無視するわけにはいかないので。



さらに問題はここからなんです。 オリジナルの説明での「衝突オブジェクトリスト」と
説明されている部分です。こちらの ④ の説明部分です。
その8 4分木空間分割を最適化する!

こんなイメージで進めようかとは考えてはいるのですが、
f:id:kandennti:20161221193024p:plain

ここで悩むのが、

このチェック後は次の空間に移動する予定なのですが、②の場合は子空間を
持ちません。この場合、スタックにオブジェクトE,Fを登録せずに親の空間に
戻ります。

の部分なんです。
仮に分割レベル2とした場合、ルート空間 - 子空間 - 孫空間 の形になります。
今回は一辺を トレランス X 2 とした立方体なので、要素が極小な為大半は
孫空間に収まるのだろうと想定しています。 その為、生成された孫空間の
上の子空間が生成されない可能性が有り、生成されていない子空間の下の
孫空間はオリジナルサイトの考え方では、巡回されない事になってしまいます。
これは困った・・・。

幸い、ルート空間・子空間でも自身の下の空間番号がわかる為、最小レベル空間
以外の要素を、全て最小レベル空間にぶち込んでしまおうかと思ってはいるも
のの、それを行うと一度チェックした組み合わせを再度チェックしてしまう事になり、
折角のアルゴリズムを効率悪くしてしまいそうな気がして・・・。

しかも、こちらで示した極端に離れた要素がある場合への対処が
上手くできない可能性も。
端点一致を探る、組み合わせテスト4 - C#ATIA


ん~何か良い方法ないかな?