你的问题相当广泛,因此我的解释变得有些冗长。我将提出两种用于轴向和径向处理的爆炸算法变体。
为了用示例来说明它们,我将使用以下数字(仅沿轴的边界框,仅五个部分):
P1: [ 0,10] (battery)
P2: [10,14] (motor)
P3: [14,16] (cog)
P4: [16,24] (bit holder)
P5: [18,26] (gear casing)
而零件P1
to P4
准确地互相接触,P4
and 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'
to 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 仍然重叠。
另一种可能性是不定义轴的比例因子,而是定义恒定的部分距离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
,即重叠以区分两个部分。
虽然该算法以(在我看来)更好的方式处理上述情况,但我们必须特别注意覆盖多个其他部分且不应包含在分组中的部分(例如,您案例中的手柄顶部)。
一种可能性是第一步将部件分组,然后将算法应用于这些组的边界框。然后可以再次将其应用于每一组中的零件,省略覆盖多个子组的零件。在你的情况下,它会是(注意嵌套分组是可能的):
[
([battery,(switch,circuit switch),motor],handle top),
motor cog,
tri-cog,
red-cog,
circle-cog,
bit-holder,
(gear casing,spring,lock knob)
]
您可能会看到我引入了两种不同类型的组:方括号中的部分/组由算法处理,即在此类组内的每个部分/子组之间添加间距,而圆括号内的组不会分解。
到目前为止,我们还没有处理径向爆炸,因为它很好地与轴处理解耦。但同样,这两种方法也可用于径向爆炸。但在我看来,第二种算法会产生更令人愉快的结果。例如。各组可按如下方式进行放射治疗:
[
(battery,switch,<many parts>,gear casing),
(switch,spring),
(handle top, lock knob)
]
在这种情况下,我们将添加一个附加组件r
到第二组中的所有径向中心并且2*r
给第三组的所有人。
请注意,简单的缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二个算法使用附加信息(分组)。
我希望这个相当长的解释能给您一些如何进一步进行的想法。如果我的解释在某些时候不清楚或者您还有其他问题,请随时发表评论。