2

如何计算球体周围的点?我的粒子爆炸需要这个。我不希望粒子的点都是随机的。我需要它们呈球形。对于 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);
}
4

3 回答 3

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(θ)
于 2012-03-20T13:26:06.220 回答
5

你有几个选择。

Lat / Lon - 以您喜欢的任何间隔循环从 -π/2 到 + π/2 的纬度和从 0 到 2π 的经度。然后从球坐标转换为笛卡尔坐标。虽然这很容易编码,但它的缺点是点倾向于聚集在两极。

Tessellation - 你可以选择一个规则的多面体,最好是三角形的面,(二十面体是我最喜欢的)并递归地找到每个面的每个边缘的平分线。然后将该面分成四个三角形面,对平分线点进行归一化,使它们位于球体的表面上。尽管这些点在球体上的分布不是很均匀(如果您不使用二十面体作为基础多面体,可以看出这一点),但它似乎比纬度/经度方法分布更均匀。它有一个缺点,就是更难编码。此处提供了更详细的说明。

随机点- 我知道您说过您不喜欢选择随机点的想法,但为了完整起见,我将其包含在此处。在Wolfram 的网站上有很好的处理方法。

于 2012-03-20T13:29:37.623 回答
3

如果可以使用新的 c++11 标准,很容易创建高斯分布的随机数。然后你可以利用三个一维高斯数组成一个三维高斯坐标的事实,该坐标均匀分布在一个恒定半径的球体上(半径是高斯分布的)。如果您只想要特定半径上的坐标,则必须标准化您的坐标。以下是您的操作方法:

#include <iostream>
#include <random>
#include <cmath>


using namespace std;

int main (int argC, char* argV[])
{
    //Create random generator
    mt19937 rnd;
    //Create Gaussian distribution
    normal_distribution<double> normDist ( 0.0, 1.0 );
    //Seed random generator
    rnd.seed(time(NULL));

    const double sphereRadius = 1;

    //Create 3 Gauss Random Numbers
    double rndArray[3];
    double rndSqrSum = 0;
    for ( uint i = 0; i < 3; i++ )
    {
        rndArray[i] = normDist( rnd );
        rndSqrSum += rndArray[i] * rndArray[i];
    }

    //Calculate Faktor to get a Sphere of radius sphereRadius
    double faktor = sphereRadius / sqrt( rndSqrSum ) ;

    //The random Coordinates then are:
    double x = rndArray[0]*faktor;
    double y = rndArray[1]*faktor;
    double z = rndArray[2]*faktor;

    cout << "Koordinates are: " << endl << "x: " << x << endl << "y: " << y << endl << "z: " << z << endl << "Radius is: " << sqrt(x*x+y*y+z*z) << endl;

}

对于您的应用程序可能不需要但很有用,此方法可用于任意维度,例如。20维问题。

于 2012-03-20T13:47:36.280 回答