あなたの質問は非常に広いので、私の説明はどういうわけか長くなりました。軸方向と半径方向の両方の処理について、爆発アルゴリズムの 2 つのバリエーションを提案します。
例でそれらを説明するために、次の数字を使用します (軸に沿った境界ボックスのみ、5 つの部分のみ)。
P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)
パーツ同士P1
がP4
ぴったりと接触しP4
、P5
実際に重なっています。
最初のものは、あなたが提案したように、基本的に距離を係数でスケーリングするアルゴリズムです。部品のサイズがアセンブリ内だけでなく、重なり合う部品でも大きく異なる場合に問題が発生します(たとえば、軸に沿った例では、円歯車の延長はビットホルダーよりもはるかに小さいです)。
スケーリング係数を とするとf
、各バウンディング ボックスの中心は でスケーリングされますがf
、拡張はそうではありません。その場合の部品は
P1: 5 + [-5,5] => P1': 5*f + [-5,5]
P2: 12 + [-2,2] => P2': 12*f + [-2,2]
P3: 15 + [-1,1] => P3': 15*f + [-1,1]
P4: 20 + [-4,4] => P4': 20*f + [-4,4]
P5: 22 + [-4,4] => P5': 22*f + [-4,4]
パーツ間の距離は、次の式で与えられP1'
ます。P4
P2' - P1' : (12*f-2) - (5*f+5) = 7*(f-1)
P3' - P2' : (15*f-1) - (12*f+2) = 3*(f-1)
P4' - P3' : (20*f-4) - (15*f+1) = 5*(f-5)
予想どおり、違いはゼロですf=0
が、分解図の場合、距離は個別のパーツのサイズに大きく依存します。サイズのバリエーションがもっと大きくなると、これはあまり見栄えがしないと思います。
重複部分に追加
P5' - P4' : (22*f-4) - (20*f+4) = 2*f-8
それらは妥当な f に対してまだ重なり合っています。
もう 1 つの可能性は、軸のスケーリング係数ではなく、一定のパーツ距離を定義することですd
。次に、境界ボックスは次のように整列されます。
P1': [ 0,10]
P2': [10,14]+d
P3': [14,16]+2*d
P4': [16,24]+3*d
P5': [18,26]+4*d+6
最後の行に を追加したことに注意してください24-8=6
。つまり、2 つの部分を区別するために重複しています。
このアルゴリズムは上記のケースを(私の意見では)より良い方法で処理しますが、他の複数の部分をカバーし、グループ化に含めるべきではない部分に特別な注意を払う必要があります(例:あなたの場合は上部を処理します)。
1 つの可能性は、最初のステップでパーツをグループにグループ化し、次にこれらのグループの境界ボックスにアルゴリズムを適用することです。その後、複数のサブグループをカバーする部分を省略して、各グループの部分に再度適用できます。あなたの場合は次のようになります(ネストされたグループ化が可能であることに注意してください):
[
([battery,(switch,circuit switch),motor],handle top),
motor cog,
tri-cog,
red-cog,
circle-cog,
bit-holder,
(gear casing,spring,lock knob)
]
2 つの異なる種類のグループを導入したことがわかるかもしれません: 角括弧内のパーツ/グループはアルゴリズムによって処理されます。つまり、そのようなグループ内の各パーツ/サブグループ間にスペースが追加されますが、丸括弧内のグループは分解されません。
これまでは、軸の処理から適切に分離されているため、放射状の爆発を処理していませんでした。しかし、放射状の爆発にも同じ両方のアプローチを使用できます。しかし、私の意見では、2 番目のアルゴリズムの方がより快適な結果が得られます。例えば、グループは放射状治療のために次のように行うことができます:
[
(battery,switch,<many parts>,gear casing),
(switch,spring),
(handle top, lock knob)
]
この場合、追加のコンポーネントr
を 2 番目のグループのすべての半径中心と2*r
3 番目のグループのすべてに追加します。
単純なスケーリング アルゴリズムは特別なユーザー ガイダンスなしで (スケーリング係数が与えられると) 実行されるのに対し、2 番目のアルゴリズムは追加情報 (グループ化) を使用することに注意してください。
このかなり長い説明が、さらに先に進む方法についてのアイデアを提供してくれることを願っています。私の説明が不明な点がある場合、またはさらに質問がある場合は、お気軽にコメントしてください。