【发布时间】:2019-11-07 21:43:55
【问题描述】:
我正在努力解决一个 3D 问题,我正在努力寻找一种有效的算法。
我有一个给定宽度、高度和深度的边界框。
我也有一个球体列表。即每个的中心坐标 (xi,yi,zi) 和半径 ri球体。
保证球体能适应边界框,并且不会相互重叠。
所以我的情况是这样的:
现在我有了一个半径为 r 的新球体,我必须将其放入边界框内,而不是与之前的任何球体重叠。
我还有一个目标点 T = (x,y,z),我的目标是让这个新球体(在上述条件下)尽可能靠近这个目标点。
我正在尝试构建一种有效的算法来找到新球体的最佳位置。 Optimal as in:尽可能靠近目标点。或者,如果边界框内的任何地方都没有空间可以在现有球体之间或周围放置新球体,则结果为“假”。
我已经想到了各种复杂的方法,例如构建剩余体积的某种参数化描述,从边界框开始,并逐个减去现有球体。但这似乎并没有引导我找到可行的解决方案。
请注意,有很多已知的“球体填充”算法,但它们往往只是用随机球体填充体积。他们也经常使用试错法,只是做一定数量的随机尝试然后终止。
而我有一个给定的特定新球体尺寸,我需要适应它(或发现这是不可能的)。
【问题讨论】:
-
将所有现有球体扩大 r 并尝试在边界框中放置一个点,该点不在任何球体内部。这在一定程度上简化了问题,但仍然没有提供最佳解决方案。
-
谢谢,是的,我也想过这个问题。这将问题减少到在一组球体之间找到一个点。但在这种情况下,我仍然看不到如何有效地搜索尽可能接近 T 的点。
-
应用@samgak 的巧妙技巧后,我将使用有符号距离函数来表示现有球体:这是一个函数,给定一个 (x, y, z) 点,返回一个浮点值这给出了到最近球体表面的距离,或者如果该点在球体内,则为负值——这实际上只是所有现有球体上
EuclideanDistance((cx[i], cy[i], cz[i]), (x, y, z)) - cr[i] - r的最小值。这可以通过仅考虑“附近”球体来加速。尝试在几个方向上小步走,然后朝着最能增加功能的方向移动。
标签: algorithm optimization 3d volume packing