-1

假设我从一个定义半径 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)

(创建中心的六边形)。到现在为止,我意识到我可以用一个简单的算法继续构建新的球体,该算法只是创建等距三角形,使用两个球体的中心来创建第三个球体(这就是我计算四个新球体的位置的方法球体以上)。

但是,进入第三维(即:在其他球体的顶部或下方添加新球体)是我卡住的地方,因为我看不到一种智能地编写代码来做到这一点的方法。

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

谢谢你。

4

2 回答 2

1

一旦您将其中三个球体放在一个三角形中,您就可以在它们上面堆叠一个。新球体的 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)

在第二层中拥有一个球体后,您可以通过上述方法在该层中添加更多球体。

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

于 2012-12-23T18:56:28.153 回答
1

其基础是正则单纯形的概念. 如果所有球体的半径相同,则只需生成越来越多的规则单纯形。在二维中,正则单纯形是等边三角形。在 3D 中,正则单纯形是等边四面体(如 wiki 页面所示)。请注意,一旦你有了一个三角形,你可以通过在三角形平面的两侧创建另一个点(在计算的距离处)来创建四面体。因此,您可以从该三角形中创建两个四面体。此时,该体积的每个三角形面也是一个等边三角形,通过在每个三角形面的外部创建一个新点,您可以为每个三角形创建一个新的四面体。您可以对创建的每个新面重复该过程(为您创建的每个四面体创建三个新面)。

于 2012-12-23T19:10:35.333 回答