我感兴趣的是生成围绕球体“均匀”(且非随机)分布的点,就像高尔夫球的凹坑或足球上六边形的顶点一样。是否有明确定义的算法可以做到这一点?
注意:我知道这些点并不是真正“均匀”分布在球体上,但它们的分布方式是,从直视任何点的任何方向看,点的分布看起来都是相同的 - 这就是我的情况有兴趣。
细分八面体并随后标准化顶点可以得到非常好的结果。看这里 http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/sphere_cylinder/更多细节。保罗·伯克有很多有趣的东西。
这是我在五分钟内编写的一些伪 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;
}
此代码适用于任何由逆时针三角形组成的多面体,但八面体是最好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)