LINUX.ORG.RU

Алгоритм размещения объектов внутри сферы или алгоритм размещения обломков от взрыва

 , , ,


0

1

Добрый день.

Ткнёт ли кто-нибудь в алгоритм размещения кучи объектов случайным образом внутри сферы? Или алгоритм размещения обломков от взрыва?

Объектов около 50-70 штук, одинакового размера. Объекты плоские, должны быть повёрнуты «лицом» из центра сферы (то есть, не должны смотреть из центра сферы ребром), ширина объекта – 0.23 радиуса сферы, высота – 0.16. Размещение в 3D-пространстве, естественно.

★★

генерируй случайным образом радиус и два угла - это будут полярные координаты объектов. Как повернуть лицом сам догадаешься?

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Не изотропное размещение будет, в полярных координатах на полюсах особенности. Лучше уж случайно три компоненты координат в диапазоне (-1, 1) и нормировать вектор на единицу.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Лучше уж случайно три компоненты координат в диапазоне (-1, 1) и нормировать вектор на единицу.

Так получится не слишком-то равномерно.

Не изотропное размещение будет, в полярных координатах на полюсах особенности.

По углам там всё хорошо будет, а для радиуса нужно подобрать распределение (только что-то оно в головеу меня сходу не строится, не высыпаюсь в последнее время...)

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от AIv

Не изотропное размещение будет, в полярных координатах на полюсах особенности.

эти особенности имеются при трансформации координат. А так никаких проблем не будет. Все будет как раз изотропно. Хотя нет. Будет даже лучше, чем изотропно. К центру шара будет больше кусочков, прям как при настоящем взрыве. А если надо совсем изотропно, тогда можно взять распределение вероятности по радиусу с обратным кубом.

Лучше уж случайно три компоненты координат в диапазоне (-1, 1) и нормировать вектор на единицу.

вот тогда точно не изотропно будет.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Manhunt

Ничего там хорошо не будет по углам - будет сгущение на полюсах. Интеграл по сфере помнишь как в сферических координатах пишется? d \phi \sin \theta d \theta Синус там не зря стоит...

Не верите с dikiy - попробуйте.

Если брать три равномерных случайных источника по координатам в диапазоне [-1,1] и потом нормировать вектор на единицу, то будет ПОЧТИ изотропно (углы куба чуток добавят, но 8 слабых пятен лучше чем 2 сильных). На 50-70 точках это вряд ли заметишь.

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

Распределение по радиусу нас я понял ТС-у не нужно. А для разворота объектов нужно занть как они реализованы, но он молчит же аки партизан.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Не изотропное размещение будет, в полярных координатах на полюсах особенности. Лучше уж случайно три компоненты координат в диапазоне (-1, 1) и нормировать вектор на единицу.

Не нужно нормировать, нужно проверять попадает ли точка в сферу. Если не попала, то генерируем следующую точку.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Не нужно нормировать, нужно проверять попадает ли точка в сферу. Если не попала, то генерируем следующую точку.

Тьфу... да, я ступил.

AIv ★★★★★
()
Ответ на: комментарий от Y

Спасибо Кэп!

Объект то как у Вас задан? Это полигон (задается последовательностью вершин), или фрагмент плоскости ограниченный аналитической функцией, или еще какая фигня?

AIv ★★★★★
()

А если хочется без отбросов в случае с кубом, то можно так

1. выбираем радиус, плотность распределения ~ 1/r**2. Тут проблема с нулевым радиусом, придётся начинать с какого-то минимального r0 > 0;

2. далее долготу, равномерное распределение;

3. затем широту, плотность распределения ~ cos(x);

но на полюсах всё равно будет не очень если сильно придираться

mashina ★★★★★
()
Ответ на: комментарий от mashina

Забавно, что можно построить случайный источник по радиусу аналитически, вроде должно быть R/xi_r, xi_r равномерно распределен R<xi_r<\inf, R максимальный радиус сферы.

А вот по theta плотность должна быть 1/sin(theta) а не косинус?

PS, не, про тета я гоню, но там точно НЕ косинус - плотность не может быть отрицательной;-)

AIv ★★★★★
()
Последнее исправление: AIv (всего исправлений: 1)
Ответ на: комментарий от AIv

Забавно, что можно построить случайный источник по радиусу аналитически, вроде должно быть R/xi_r, xi_r равномерно распределен R<xi_r<\inf, R максимальный радиус сферы.

Честно говоря не понял что тут написано, но ниже ошибся, плотность распределения по радиусу ~ r**2 и особенности в нуле нет, будет как-то так f(r) = 3 * (r**2 / R**3)

А вот по theta плотность должна быть 1/sin(theta) а не косинус?

вроде нет, плотность угла пропорциональна радиусу широты, он = r * cos(theta)

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 2)
Ответ на: комментарий от mashina

Блин, да вообще все не так, Вы гоните а я уже сплю;-)

Распределение по радиусу ~r^2 (итоговая плотность константа, объем пропорционален r^2). Первообразная r^3/3, источник - обратная функция 3 xi^(1/3.), xi равномерно распределенная величина на отрезке [0,R^3/3] где R - радиус сферы.

Распределение по тета из аналогичных соображений ~sin(theta). Первообразная 1-cos(theta), источник acos(1-xi), xi равномерно распределено в интервале [0,2]

Только боюсь ТС не асилит...

AIv ★★★★★
()
Ответ на: комментарий от mashina

Честно говоря не понял что тут написано

Построить источник дающий случайные числа по заданному распределению это отдельная задача. Далеко не для всех распределений можно сваять аналитическую ф-ю которая применяется к равномерно распределенному случ. числу.

AIv ★★★★★
()
Ответ на: комментарий от mashina

Полюс. Да, я поленился расписывать, берется интеграл \int\limits_{x_min}^x f(x') dx', а потом от него строится обратная функция - это и будет источник.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Далеко не для всех распределений можно сваять аналитическую ф-ю которая применяется к равномерно распределенному случ. числу.

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

mashina ★★★★★
()
Ответ на: комментарий от AIv

Полюс

если полюс, то, наверное, ок. У меня отчёт от плоскости экватора.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Обычно такие вещи делают на сетке, особенно если f задана на сетке. Получается муторно.

AIv ★★★★★
()

Или алгоритм размещения обломков от взрыва?

Со взрывом всё примерно также если он сферический изотропный, только будет другое распределение по r.

Для одинаковых осколков нужно придумать ф-ю распределения передачи энергии в диапазоне [0, 1] так, чтобы среднее было близко к 1. Тогда r для каждого осколка выбираем r = C * k * t, где C подгоночная константа, t время и k коэффициент передачи.

Для физически различных осколков будет r = С * k * t / m, где m некая мера инертности (масса) осколка, можно взять пропорциональной размеру.

Параметры C, t подгоняются в зависимости от требуемой эстетичности.

mashina ★★★★★
()
Ответ на: комментарий от AIv

Если хочется совсем изотропно то можно...

...решать задачу Томсона для n=100500 с последующим случайным выбором из них 50-70 точек.

quickquest ★★★★★
()
Ответ на: комментарий от AIv

Ничего там хорошо не будет по углам - будет сгущение на полюсах.

хм. подумал еще раз и ты оказался прав. сетка же «сходится» там как раз из-за вырождения якобиана.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Y

А как перевести полярные координаты в 3D-координаты зная радиус?

открой википедию. там все написано.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Y

Ну тогда компоненты вектора переводим в углы и они же и будут углами поворота объекта. Только там где то pi/2 прибавить надо будет. Для перевода юзаем ф-ю atan2.

AIv ★★★★★
()

а говорят, что математика не нужна

kto_tama ★★★★★
()
Ответ на: комментарий от baverman

Кстати, тут математики как раз переняли эту технологию у программистов, по сути, что предложил mashina --- это rejection sampling. И вообще он дал очень и очень дельный совет! Главное что работает быстро(в R^3), просто, и сэмплит равномерно.

maggotroot
()
Ответ на: комментарий от AIv

Лучше уж случайно три компоненты координат в диапазоне (-1, 1) и нормировать вектор на единицу.

И в результате у тебя в проекциях вершин куба на сферу плотность точек будет выше.

Deleted
()
Ответ на: комментарий от mashina

Когда-то давно мне подсказали делать вот так:

#define SQR(x) ((x)*(x))

/* Get random speed vector. */
static void randomizeSpeed(struct Vector *v)
{
	double g1, g2;
	double fi;
	double s_cos;
	
	g1 = rand()/((double)RAND_MAX);
	g2 = rand()/((double)RAND_MAX);
	
	fi = PI2*g1;
	
	v->z = 2.0*g2 - 1.0;
	s_cos = sqrt(1.0 - SQR(v->z));
	
	v->x = cos(fi)*s_cos;
	v->y = sin(fi)*s_cos;
}
Подсказывал человек, шарящий в математике и я не задумывался почему это работает правильно. Как минимум, если рисовать несколько тысяч точек на сфере каким-нибудь гнуплотом, то эта функция визуально даёт гораздо более качественный результат, чем нормализация рандомного вектора.

Deleted
()
Ответ на: комментарий от Deleted

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

Вариант из «вольфрама»: Sphere Point Picking.

quickquest ★★★★★
()
Ответ на: комментарий от Deleted

Если брать три равномерных случайных источника по координатам в диапазоне [-1,1] и потом нормировать вектор на единицу, то будет ПОЧТИ изотропно (углы куба чуток добавят, но 8 слабых пятен лучше чем 2 сильных). На 50-70 точках это вряд ли заметишь.

отсюда: Алгоритм размещения объектов внутри сферы или алгоритм размещения обломков от взрыва (комментарий)

пральное решение в сферических координатах: Алгоритм размещения объектов внутри сферы или алгоритм размещения обломков от взрыва (комментарий)

AIv ★★★★★
()
Ответ на: комментарий от AIv

Конечно, потому что тут надо считать CDF, что вообще убого и долго, rejection sampling даст все намного быстрее и проще: генерируйте из куба и берите только если внутри сферы. Но если ОПу хочется запрогать именно по формулам все, то пусть смотрит где более подробно написано http://en.wikibooks.org/wiki/Mathematica/Uniform_Spherical_Distribution .

maggotroot
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.