Я пытаюсь создать однородные случайные точки на поверхности единичной сферы для программы трассировки лучей Монте-Карло.Когда я говорю равномерно, я имею в виду, что точки равномерно распределены по площади поверхности.Моя текущая методология состоит в том, чтобы вычислять однородные случайные точки на полушарии, указывающие на положительную ось z и базу в плоскости xy.
Случайная точка на полусфере представляет направление излучения теплового излучения для диффузного серого излучателя.
Я получаю правильный результат, когда использую следующие вычисления:
Примечание: dsfmt * is вернет случайное число от 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);
Хотя последние два метода работают в несколько раз быстрее, чем первый, при их использовании я получаю результаты, которые показывают, что они не генерируют однородные случайные точки на поверхности сферы, а скорее дают распределение, которое благоприятствует экватору.
Кроме того, последние два метода дают одинаковые конечные результаты, однако я уверен, что они неверны, поскольку я сравниваю их с аналитическим решением.Однако распределение не дает правильного результата.
Ошибка в моей реализации или я пропустил основную идею во втором и третьем методах?