Как равномерно распределить точки на поверхности сферы? - PullRequest
1 голос
/ 12 января 2012

Я пытаюсь сделать звезды на небе, но распределение звезд не равномерное.

Это то, что я пробовал:

rx = rand(0.0f, PI*2.0f);
ry = rand(0.0f, PI);
x = sin(ry)*sin(rx)*range;
y = sin(ry)*cos(rx)*range;
z = cos(ry)*range;

Что приводит к:

img http://img716.imageshack.us/img716/3320/sphererandom.jpg

И:

rx = rand(-1.0f, 1.0f);
ry = rand(-1.0f, 1.0f);
rz = rand(-1.0f, 1.0f);
x = rx*range;
y = ry*range;
z = rz*range;

Что приводит к:

img2 http://img710.imageshack.us/img710/5152/squarerandom.jpg

(не создает сферу, но OpenGL будетне отличить, однако).

Как видите, всегда есть некоторый «угол», где в среднем больше точек.Как я могу создать случайные точки на сфере, где точки будут распределены равномерно?

Ответы [ 3 ]

4 голосов
/ 12 января 2012

вы можете сделать

z = rand(-1, 1)
rxy = sqrt(1 - z*z)
phi = rand(0, 2*PI)
x = rxy * cos(phi)
y = rxy * sin(phi)

Здесь rand (u, v) рисует случайную единицу из целого [u, v]

1 голос
/ 12 января 2012

Вам не нужна тригонометрия, если вы можете генерировать случайные гауссовские переменные, вы можете сделать (псевдокод)

x <- gauss()
y <- gauss()
z <- gauss()
norm <- sqrt(x^2 + y^2 + z^2)

result = (x / norm, y / norm, z / norm)

Или нарисовать точки внутри куба, пока одна из них не окажется внутри шара, а затемнормализовать:

double x, y, z;

do
{
    x = rand(-1, 1);
    y = rand(-1, 1);
    z = rand(-1, 1);
} while (x * x + y * y + z * z > 1);

double norm = sqrt(x * x + y * y + z * z);
x / norm; y /= norm; z /= norm;
0 голосов
/ 12 января 2012

Похоже, вы видите, что именно декартовы координаты создают концентрации.

Здесь - это объяснение одного правильного (и неправильного) способа получения правильного распределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...