gpt4 book ai didi

algorithm - 在球体上均匀生成点

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:16 26 4
gpt4 key购买 nike

我对生成围绕球体“均匀”(且非随机)分布的点很感兴趣,就像高尔夫球的酒窝或足球的六边形顶点一样。是否有明确定义的算法来执行此操作?

注意:我知道这些点并不是真正“均匀”分布在一个球体上,但它们的分布方式是从任何方向直视任何一个点,这些点的分布看起来都是一样的——这是我感兴趣的。

最佳答案

分割八面体并在之后对顶点进行归一化会产生非常好的结果。 Look here更多细节。 Paul Bourke 有很多有趣的东西。

这是我在五分钟内编写的一些伪 C++ 代码:

/* Assume 'data' initially holds vertices for eight triangles (an octahedron) */
void GenerateSphere(float radius, std::vector<Vector3f>& data, int accum=10)
{
assert( !(data.size() % 3) );

std::vector<Vector3f> newData;

for(int i=0; i<data.size(); i+=3){
/* Tesselate each triangle into three new ones */
Vector3f centerPoint = (data[i] + data[i+1] + data[i+2]) / 3.0f;

/* triangle 1*/
newData.push_back(data[i+0]);
newData.push_back(data[i+1]);
newData.push_back(centerPoint);
/* triangle 2*/
newData.push_back(data[i+1]);
newData.push_back(data[i+2]);
newData.push_back(centerPoint);
/* triangle 3*/
newData.push_back(centerPoint);
newData.push_back(data[i+2]);
newData.push_back(data[i+0]);
}
data = newData;
if(!accum){
/* We're done. Normalize the vertices,
multiply by the radius and return. */
for(int i=0; i<data.size(); ++i){
data[i].normalize();
data[i] *= radius;
}
} else {
/* Decrease recursion counter and iterate again */
GenerateSphere(radius, data, accum-1);
}
return;
}

此代码适用于任何由逆时针三角形组成的多面体,但八面体是最好的。

关于algorithm - 在球体上均匀生成点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com