计算球体周围的点

Ste*_*veL 1 c++ math geometry particle-system

如何计算球体周围的点?我的粒子爆炸需要这个.我不希望粒子的点是随机的.我需要它们呈球形.对于2d圈爆炸,我使用了这个:

float n=many;
float rad = 1;
for (int i = 0; i < n; i++)
{
        float fi = 2*PI*i/n;
        float x1 = rad*sin(fi + PI)+x ;
        float y1 = rad*cos(fi + PI)+y ;
        addparticlesmart(x,y,(x1-x),(y1-y), 0.01f),r,g,b,a,0.02f);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

从球形坐标到笛卡尔坐标的完全转换:

Cartesian coordinates: (x,y,z)
Spherical coordinates: (r,?,?) with r?[0,?), ??[0,2?), ??[0,?]

Then:
x = r*cos(?)*sin(?)
y = r*sin(?)*sin(?)
z = r*cos(?)
Run Code Online (Sandbox Code Playgroud)


and*_*and 5

你有几个选择.

纬度/经度 - 在纬度上从-π/ 2到+π/ 2,经度从0到2π,无论你喜欢什么间隔.然后从球形坐标转换为笛卡尔坐标.虽然这很容易编码,但它的缺点是点往往聚集在极点.

镶嵌 - 您可以选择一个正多面体,最好是三角形面(二十面体是我最喜欢的用途)并递归地找到每个面的每个边缘的平分线.然后,将该面分成四个三角形面,对等分线点进行标准化,使它们位于球体的表面上.虽然这些点在球体上的分布并不是很均匀(如果不使用二十面体作为基础多面体,可以看到它),它看起来比纬度/经度方法分布更均匀.它有一个缺点,代码更难一些.更详细的说明,请点击这里.

随机点 - 我知道你说你不喜欢选择随机点的想法,但为了完整性,我会把它包含在这里.在Wolfram的网站上有一个很好的治疗方法.