我正在寻找一种在3D中随机紧密打包球体的算法。诀窍是我想在一定数量的现有球体周围打包球体。例如,给定3D中100到1000个球体(它们有固定的位置和大小;它们可能重叠,也可能不同大小),我想在它们周围打包球体(大小相同,位置可以自由选择)(没有重叠)。
良好填料质量的度量标准是填料密度或孔隙率。本质上,我希望固定球体和填料球体占据紧凑的空间体积(例如大致球形,或围绕固定球体分层填料),尽可能少的空隙。
有没有现成的算法可以做到这一点?你会如何平衡计算速度和包装质量?
更新包装密度的细节:这取决于计算选择的体积。为此,我们希望在固定的球体周围包装一定数量的球体。形成一个点的表面,这些点与最近的固定球体的表面正好有一个距离d;包装密度应该在该表面所包围的体积内计算。如果d=包装球体大小的倍数,这很方便。(假设我们可以根据需要放置至少一样多的自由球体来填充该体积;可能有多余的,它们放在哪里并不重要)
固定球体和所有可变球体的大小都非常相似(假设在从最小到最大的2倍范围内)。在实践中,固定球体的重叠程度也是有限的:没有一个固定球体比任何其他固定球体更接近一定的距离(直径约为0.2-0.3)(因此可以保证它们是分散的,和/或只重叠几个邻居,而不是相互重叠)
悬赏公布!
使用一个格子,其中每个点与填充球的直径等距。任何满足上述定义的格子形状就足够了。
定向晶格的平移和旋转,以最小化固定球的中心偏移,从而产生世界变换。
固定通行证1:
创建一个列表,列出固定球体半径内填充球体直径的任何点阵点。对于后者,将位置(原点)差异向量保存在列表中。
标记在格子点(删除)列表中。
格子通行证1:
将任何重叠的固定球体的距离向量组合起来,即将原点重新定位到重叠点(真正的重叠或扩展以填充半径)。将值存储在一侧并标记在另一侧,以允许多次重叠。
这就是需要做出决定的地方:
格子通行证2:
添加缺失,即填充半径1内没有其他点,并且不在固定球体(其他半径填充半径)附近标记为已删除的点。这应该是少量的点。
格子通行证3:
调整所有网格位置,使其更接近适当的网格行间距。这将单调地减小点之间的距离,仅限于
重复3-4次(或更多)。对创建的点的第一遍应用少量的随机性(每维最大1到-1像素)偏差偏移,以避免翘曲后任何相等的行间距冲突。如果没有创建合适的间隙,解决方案可能会陷入优化不佳的解决方案。
每个填充球都以格子网格点为中心。
我可以看到许多改进和优化的领域,但重点是提供一个明确的有点快的算法,这是好的,但不能保证最佳。
注意1和2之间的区别:
1号创建了一个与其他球体碰撞的球体,并要求所有填充物多次移动以解决碰撞。
数字2只在空的空间中创建新的球体,并将其余的球体向内移动以适应,从而导致更快的收敛,因为没有冲突需要解决。