C++ 如何在C+中从单个球体开始构建密集堆积的球体+;?

C++ 如何在C+中从单个球体开始构建密集堆积的球体+;?,c++,arrays,geometry,packing,C++,Arrays,Geometry,Packing,让我们假设我从一个定义半径为R的球体和一个包含笛卡尔坐标的三个元素的数组开始: double vecpos[3]; vecpos[0]= 0.0; vecpos[1]= 0.0; vecpos[2]= 0.0; double radius= 5; 现在,我想添加其他球体。这些额外的球体应该是理想的填充物,尽可能致密 我正在寻找一种算法,从这个单一的球体开始,以最密集的方式添加更多的球体。当然,球体可能不会重叠(即,球体的行为类似于实心大理石) 到目前为止,我的尝试集中在添加更多球体(例如,在原

让我们假设我从一个定义半径为R的球体和一个包含笛卡尔坐标的三个元素的数组开始:

double vecpos[3];
vecpos[0]= 0.0;
vecpos[1]= 0.0;
vecpos[2]= 0.0;
double radius= 5;
现在,我想添加其他球体。这些额外的球体应该是理想的填充物,尽可能致密

我正在寻找一种算法,从这个单一的球体开始,以最密集的方式添加更多的球体。当然,球体可能不会重叠(即,球体的行为类似于实心大理石)

到目前为止,我的尝试集中在添加更多球体(例如,在原始球体的左侧和右侧,因此在位置:

(10,0,0) 
(-10,0,0)
然后在顶部和底部添加新的(在计算位置:

(5, sqrt(3)/2 * 10, 0)
(-5, sqrt(10)/2 * 10, 0)
(5, sqrt(3)/2 * -10, 0)
(-5, sqrt(3)/2 * -10, 0)
(创建中心的六边形)。到目前为止,我意识到我可以通过一个简单的算法继续创建新球体,该算法只创建等距三角形,使用两个球体的中心创建第三个球体(这就是我如何计算上述四个新球体的位置)

然而,进入第三维(即:在其他球体的上方或下方添加新球体)是我遇到困难的地方,因为我看不到一种智能地编写代码的方法

任何解决我的问题或比我的解决方案更简单的建议都是非常受欢迎的


谢谢。

三角形中有三个球体后,可以将其中一个堆叠在其上。新球体的x和y坐标将是下面三个球体的平均值,增加的高度将为2 sqrt(6)R/3。因此,如果较低的三个球体

A=(0,0,0)
B=(2R,0,0)
C=(R,sqrt(3)R,0)

那么新的将是

D=(R,sqrt(3)R/3,2 sqrt(6)R/3)

一旦在第二层中有一个球体,就可以按照上面描述的方法在该层中添加更多球体


请注意,您可以选择选择哪个三角形…

这一点的基础是a的概念。如果所有球体的半径都相同,则只需生成越来越多的规则单纯形。在2D中,规则单纯形是等边三角形。在3D中,规则单纯形是等边四面体(如wiki页面所示)。请注意,一旦有了三角形,就可以通过创建另一个点(以计算的距离)来创建四面体在三角形平面的两侧。你可以从三角形中创建两个四面体。此时,该体积的每个三角形面也是一个等边三角形,通过在每个三角形面外侧创建一个新点,你可以为每个三角形面创建一个新的四面体。你可以在每个三角形面上重复这个过程创建的新面(为您创建的每个四面体创建三个新面)。您可以使用此算法生成一组紧密排列的球体(中心位于四面体的点,半径为四面体侧面长度的一半),或者创建四面体“网格”(三角形网格或网格的一种体积形式,在各种应用中很常见)。

1…1a.可能会在网站上询问您对此是否有问题2.实施解决方案…2a.如果您在实施过程中遇到编程问题,请询问