Генерация случайной точки в цилиндре - PullRequest
2 голосов
/ 09 февраля 2012

Каков наилучший способ или алгоритм для генерации случайной трехмерной точки [x, y, z] внутри объема круглого цилиндра, если заданы радиус r и высота h цилиндра?

Ответы [ 4 ]

9 голосов
/ 09 февраля 2012

Как насчет - в псевдокоде Python значение R будет радиусом, а H - высотой:

s = random.uniform(0, 1)
theta = random.uniform(0, 2*pi)
z = random.uniform(0, H)
r = sqrt(s)*R
x = r * cos(theta)
y = r * sin(theta)
z = z # .. for symmetry :-)

Проблема с простым взятием x = r * cos(angle) и y = r * sin(angle) заключается в том, что тогда, когда r малото есть в центре круга незначительное изменение r не сильно меняет положения x и y.Таким образом, это приводит к неравномерному распределению в декартовых координатах, и точки концентрируются к центру круга.Получение квадратного корня исправляет это, по крайней мере, если я правильно сделал свою арифметику.

[Ах, похоже, что sqrt было правильным .]

(Примечаниея предположил, не думая об этом, что цилиндр выровнен с осью z, а центр цилиндра расположен в (0,0, H / 2). Было бы менее произвольно установить (0,0,0) вцентр цилиндра, и в этом случае z следует выбирать в диапазоне от -H / 2 до H / 2, а не 0, H.)

2 голосов
/ 09 февраля 2012

Создание случайной точки внутри прямоугольного тела, описывающего цилиндр;если он внутри цилиндра (вероятность пи / 4), сохраните его, в противном случае откажитесь от него и попробуйте снова.

0 голосов
/ 09 февраля 2012

Ось z проста: -0,5 * ч <= z <= 0,5 * ч </p>

Х и у равны окружности: х ^ 2 + у ^ 2 <= г ^2 </p>

Бат математику давно для меня: -)

0 голосов
/ 09 февраля 2012

Генерирует случайный угол (необязательно меньше 2π), случайный r меньше радиуса и случайный z меньше высоты.

x = r * cos(angle)
y = r * sin(angle)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...