Я пытаюсь создать равномерные случайные точки на поверхности единичной сферы для программы отслеживания 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);
, в то время как эти последние два метода проводят раза быстрее, чем первый, когда я использую их, я получаю результаты, которые указывают на то, что они не генерируют равномерные случайные точки на поверхности сферы, а скорее дают распределение, которое способствует экватору.
Дополнительно последние два метода дают идентичные окончательные результаты, однако я уверен, что они неверны, поскольку я сравниваю с аналитическим решением.
Каждая ссылка, которую я обнаружил, указывает на то, что эти методы производят равномерные распределения, однако я не достигаю правильного результата.
Есть ли ошибка в моей реализации или я пропустил фундаментальную идею во втором и третьим методам?