Быстрое равномерное распределенные случайные точки на поверхности единицы полушария

Я пытаюсь создать равномерные случайные точки на поверхности единичной сферы для программы отслеживания Monte Carlo Ray. Когда я говорю форму, я имею в виду точки равномерно распределены по площади поверхности. Моя текущая методология состоит в том, чтобы рассчитать равномерные случайные точки на полушарии, указывающие на положительную ось Z и основание в плоскости X-Y.

Случайная точка на полушарии представляет направление эмиссии теплового излучения для диффузного серого излучателя.

Я достигаю правильного результата, когда я использую следующие расчеты:

Примечание: DSFMT * вернет случайное число между 0 и 1.

azimuthal = 2*PI*dsfmt_genrand_close_open(&dsfmtt);
zenith = asin(sqrt(dsfmt_genrand_close_open(&dsfmtt)));

// Calculate the cartesian point
osRay.c._x = sin(zenith)*cos(azimuthal); 
osRay.c._y = sin(zenith)*sin(azimuthal);
osRay.c._z = cos(zenith);

, однако это довольно медленно, а профилирование предполагает, что он занимает большой доля времени выполнения. Поэтому я искал несколько альтернативных методов:

Метод отклонения Marsaglia 1972

do {
   x1 = 2.0*dsfmt_genrand_open_open(&dsfmtt)-1.0;
   x2 = 2.0*dsfmt_genrand_open_open(&dsfmtt)-1.0;
   S = x1*x1 + x2*x2;
} while(S > 1.0f);


osRay.c._x = 2.0*x1*sqrt(1.0-S);
osRay.c._y = 2.0*x2*sqrt(1.0-S);
osRay.c._z = abs(1.0-2.0*S);

аналитические декартовые расчеты координат

azimuthal = 2*PI*dsfmt_genrand_close_open(&dsfmtt);
u = 2*dsfmt_genrand_close_open(&dsfmtt) -1;
w = sqrt(1-u*u);

osRay.c._x = w*cos(azimuthal);
osRay.c._y = w*sin(azimuthal);
osRay.c._z = abs(u);

, в то время как эти последние два метода проводят раза быстрее, чем первый, когда я использую их, я получаю результаты, которые указывают на то, что они не генерируют равномерные случайные точки на поверхности сферы, а скорее дают распределение, которое способствует экватору.

Дополнительно последние два метода дают идентичные окончательные результаты, однако я уверен, что они неверны, поскольку я сравниваю с аналитическим решением.

Каждая ссылка, которую я обнаружил, указывает на то, что эти методы производят равномерные распределения, однако я не достигаю правильного результата.

Есть ли ошибка в моей реализации или я пропустил фундаментальную идею во втором и третьим методам?

21
задан cubiclewar 2 September 2011 в 07:31
поделиться