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π までの経度を任意の間隔でループします。次に、球座標からデカルト座標に変換します。これはコーディングが簡単ですが、ポイントが極に集中する傾向があるという欠点があります。

テッセレーション-できれば三角形の面を持つ通常の多面体を選択し (この目的では20 面体が私のお気に入りです)、各面の各エッジの二等分線を再帰的に見つけることができます。次に、その面を 4 つの三角形の面に分割し、二等分点を正規化して球の表面に配置します。ポイントは球体全体に均一に分布しているわけではありませんが (基本多面体として 20 面体を使用しない場合に見られます)、緯度/経度のアプローチよりもはるかに均一に分布しているように見えます。コーディングがやや難しいという欠点があります。詳細については、こちらを参照してください。

ランダム ポイント- ランダム ポイントを選ぶというアイデアが気に入らないとおっしゃっていたのは承知していますが、完全を期すためにここに含めておきます。Wolfram のサイトに適切な処理があります。

于 2012-03-20T13:29:37.623 に答える
3

新しい C++11 標準を使用できる場合、ガウス分散乱数を簡単に作成できます。次に、3 つの 1 次元ガウス数が 1 つの 3 次元ガウス座標を作成し、一定半径の球上に均一に分布するという事実を利用できます (半径はガウス分布しています)。特定の半径でのみ座標が必要な場合は、座標を正規化する必要があります。方法は次のとおりです。

#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 に答える