Простое равномерное создание u
и v
не обязательно приведет к однородной выборке с поверхности тора. Необходим дополнительный шаг.
Дж. Ф. Уильямсон, Случайный выбор точек, распределенных по криволинейным поверхностям, Physics in Medicine & Biology 32(10), 1987, описывает общий метод выбора равномерно случайной точки на параметрической поверхности. Это метод принятия/отклонения, который принимает или отклоняет каждую точку-кандидата в зависимости от ее коэффициента растяжения (нормы градиента). Чтобы использовать этот метод для параметрической поверхности, необходимо знать несколько вещей о поверхности, а именно:
x(u, v)
, y(u, v)
и z(u, v)
, которые являются функциями, которые генерируют трехмерные координаты из двухмерных координат u
и v
,
Диапазоны u
и v
,
g(point)
, норма градиента (коэффициент растяжения) в каждой точке поверхности, и
gmax
, максимальное значение g
для всей поверхности.
Для трехмерного тора с параметризацией, которую вы указали в своем вопросе, g
и gmax
следующие:
g(u, v) = a * (c + cos(v) * a)
.
gmax = a * (a + c)
.
Алгоритм создания однородной случайной точки на поверхности трехмерного тора с радиусом тора c
и радиусом трубы a
будет следующим (где RNDEXCRANGE(x,y)
возвращает число из [x,y)
равномерно случайным образом, а RNDRANGE(x,y)
возвращает число из [x,y]
равномерно при случайный):
// Maximum stretch factor for torus
gmax = a * (a + c)
while true
u = RNDEXCRANGE(0, pi * 2)
v = RNDEXCRANGE(0, pi * 2)
x = cos(u)*(c+cos(v)*a)
y = sin(u)*(c+cos(v)*a)
z = sin(v)*a
// Norm of gradient (stretch factor)
g = a*abs(c+cos(v)*a)
if g >= RNDRANGE(0, gmax)
// Accept the point
return [x, y, z]
end
end
Если у вас есть n-мерные формулы генерации тора, аналогичный подход можно использовать для создания однородных случайных точек на этом торе (примите точку-кандидата, если норма градиента равна или превышает случайное число в [0, gmax
), где gmax
максимальная норма градиента).
person
Peter O.
schedule
16.04.2019