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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用较小的球体最佳地填充3D球体相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

现在的算法:

  1. N粒子随机放入球体内 N应该安全地低,因此它比溶液颗粒数小。
  2. 开始现场模拟 因此,使用您的解决方案规则来创建有吸引力和排斥力,并通过Newton D'Alembert物理驱动您的粒子。不要忘记添加摩擦力(因此运动将在一段时间后停止)和球体积边界。
  3. 当粒子停止移动时停止 所以,如果max(|particles_velocity|)<threshold停止。
  4. 现在检查是否所有颗粒都正确放置 不违反任何规则。如果是,那么请记住此放置作为解决方案,并再次使用N+1粒子从#1重试。如果没有停止并使用最后正确的解决方案 为了加快速度,您可以添加更多粒子而不是使用(N+1),类似于二分搜索(添加32个粒子直到你可以...然后只有16 ......)。此外,您不需要在#1中使用随机位置进行其他运行。您可以让其他粒子开始放置在最后运行解决方案中的位置。

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

另一答案

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

以上是关于用较小的球体最佳地填充3D球体的主要内容,如果未能解决你的问题,请参考以下文章

使用滑块更改 Phong 着色器的值

球体光线追踪

使用matlab到球体中心的最小距离

Scenekit 如何在地球/球体周围弯曲/扭曲/弯曲瓷砖

在 Matplotlib 中绘制一个 3d 立方体、一个球体和一个向量

用Unity3D制作一个球体的场景如何做