用较小的球体最佳地填充3D球体
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用较小的球体最佳地填充3D球体相关的知识,希望对你有一定的参考价值。
我试图用“粒子”(由3D XYZ矢量表示)最佳地填充3D球形体积,这些粒子需要彼此保持特定的距离,同时试图最小化它们之间存在的自由空间量。
虽然有一个问题 - 粒子本身可能落在球形体积的边界上 - 它们不能存在于球体体外。理想情况下,我想最大化落在这个边界上的粒子数量(这让我觉得这是一种球形填充问题),然后向内填充剩余的体积。
有没有哪种算法可以解决这类问题?它不需要精确,但关键在于最终解决方案的密度需要相当准确(“完美”解决方案的+/- ~5%)。
答案
你的约束有点模糊,很难说肯定,但我会尝试现场方法。首先看:
- Computational complexity and shape nesting
- Path generation for non-intersecting disc movement on a plane
- How to implement a constraint solver for 2-D geometry?
和子链接,您可以在其中找到此方法的一些示例。
现在的算法:
- 将
N
粒子随机放入球体内N
应该安全地低,因此它比溶液颗粒数小。 - 开始现场模拟 因此,使用您的解决方案规则来创建有吸引力和排斥力,并通过Newton D'Alembert物理驱动您的粒子。不要忘记添加摩擦力(因此运动将在一段时间后停止)和球体积边界。
- 当粒子停止移动时停止
所以,如果
max(|particles_velocity|)<threshold
停止。 - 现在检查是否所有颗粒都正确放置
不违反任何规则。如果是,那么请记住此放置作为解决方案,并再次使用
N+1
粒子从#1重试。如果没有停止并使用最后正确的解决方案 为了加快速度,您可以添加更多粒子而不是使用(N+1)
,类似于二分搜索(添加32个粒子直到你可以...然后只有16 ......)。此外,您不需要在#1中使用随机位置进行其他运行。您可以让其他粒子开始放置在最后运行解决方案中的位置。
如何确定解决方案的准确性是完全不同的事情。由于您没有提供确切的规则,我们只能猜测。我会尝试估算理想的粒子密度,并根据球体积计算理想的粒子数。您也可以将此用于N
的初始猜测,然后与最终的N
进行比较。
另一答案
没有一个公式可以用n个球体最佳地填充球体。在this维基百科页面上,您可以看到n <= 12的最佳配置。对于n <= 500的最佳配置,您可以查看this站点。正如您在这些网站上看到的,不同数量的球体具有不同的最佳对称组。
以上是关于用较小的球体最佳地填充3D球体的主要内容,如果未能解决你的问题,请参考以下文章