- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在制作一个程序来查看 3D CAD 模型,并希望构建自动分解 View 。将要查看的所有组件都是轴对称的。有些可能不是,但大多数是。我想找出一种自动将装配体中的零件移动到分解图位置的算法。这是我想通过算法实现的示例(当然减去标签):
我必须使用的唯一值是每个部分的边界框的中心。如果需要更多信息,我可以计算更多信息,但似乎应该足够了。我想到的粗略方法是沿轴对称轴计算从装配原点到每个零件中心的矢量,然后计算相对于中心轴到零件中心的径向矢量。从那里,我需要找出一些计算方法,能够根据这两个向量的某种组合来缩放每个部分的位置。那是我不太确定该往哪个方向发展的部分。我包含的图像显示了我想要的确切功能,但我希望能够按任何浮点值缩放位置以扩展或收缩分解 View ,其中 1.0 是原始组装模型。有什么想法吗?
最佳答案
您的问题很宽泛,因此我的解释有些冗长。我将针对轴向和径向处理提出两种爆炸算法变体。
为了举例说明它们,我将使用以下数字(仅沿轴的边界框,只有五个部分):
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
缩放,但extension不是。然后零件将是
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,它们仍然重叠。
另一种可能性是不为轴定义比例因子,而是定义恒定的部分距离 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
。
请注意,简单的缩放算法在没有特殊用户指导的情况下运行(一旦给出缩放因子),而第二个算法使用额外的信息(分组)。
我希望这个相当长的解释能给您一些想法,让您了解如何进一步进行。如果我的解释在某些时候不清楚,或者您还有其他问题,请随时发表评论。
关于algorithm - CAD 的分解图算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5462847/
我是一名优秀的程序员,十分优秀!