用较小的球体最佳地填充3D球体

时间:2017-03-22 13:07:03

标签: algorithm 3d language-agnostic geometry

我试图使用"粒子"来最佳地填充3D球形体积。 (由3D XYZ向量表示)需要彼此保持特定距离,同时尝试最小化它们之间存在的自由空间量。

虽然有一个问题 - 粒子本身可能落在球形体积的边界上 - 它们不能存在于球体体外。理想情况下,我想最大限度地减少落在这个边界上的粒子数量(我认为这是一种球形填充问题),然后向内填充剩余的体积。

有没有哪种算法可以解决这类问题?它并不需要精确,但关键在于最终解决方案的密度需要相当准确(+/-约5%的完美"解决方案)。

2 个答案:

答案 0 :(得分:1)

没有一个公式可以用 n 球体最佳地填充球体。在this维基百科页面上,您可以看到 n< = 12 的最佳配置。对于 n< = 500 的最佳配置,您可以查看this站点。正如您在这些网站上看到的,不同数量的球体具有不同的最佳对称组。

答案 1 :(得分:1)

你的约束有点模糊,很难说肯定,但我会尝试现场方法。首先看:

和子链接,您可以在其中找到此方法的一些示例。

现在的算法:

  1. 在球体内随机放置N粒子

    N应该安全地低,因此它比你的溶液颗粒数小。

  2. 开始字段模拟

    所以使用你的解决方案规则来创造有吸引力和排斥力,并通过Newton D' Alembert物理学驱动你的粒子。不要忘记添加摩擦力(因此运动将在一段时间后停止)和球体积边界。

  3. 当粒子停止移动时停止

    所以如果max(|particles_velocity|)<threshold停止。

  4. 现在检查所有粒子是否正确放置

    不违反任何规则。如果是,则记住此展示位置作为解决方案,然后使用N+1粒子从#1 再次尝试。如果没有停止并使用最后正确的解决方案。

    为了加快速度,您可以添加更多粒子而不是使用(N+1)类似于二分搜索(添加32个粒子直到你可以...然后只有16 ......)。此外,您不需要在#1 中使用随机位置进行其他运行。你可以让其他粒子开始放在最后一次运行的解决方案中。

  5. 如何确定解决方案的准确性是完全不同的事情。由于您没有提供确切的规则,我们只能猜测。我会尝试估算理想的粒子密度,并根据球体积计算理想的粒子数。您也可以将其用于N的初始猜测,然后与最终N进行比较。

相关问题