Войти
ПрограммированиеФорумОбщее

Как получить случайное направление? (6 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#75
15:01, 18 авг. 2012

ALPINE
> Ура! Не зря старался:
А я что говорил в последнем абзаце? Если заменить переменные, то скорость почти не упадёт.
Теперь никак не могу понять последнюю строку
calc_dir(a1, a2, a3) := rotx(a1) . rotz(a2) . vec_dir2(a3);
Если вспомнить про ассоциативность, то получается справа налево, что сначала случайный единичный вектор в плоскости XY поворачивается вокруг z, а потом уже вокруг оси x глобальной системы.


#76
16:25, 18 авг. 2012

Алексей Патрашов
> Если вспомнить про ассоциативность
Кстати да, мой косяк. А я еще не мог понять, почему диапазоны углов не такие, как подсказывает логика. Выбрал их в итоге экспериментально. Но сути всё это не меняет.

#77
16:41, 18 авг. 2012

ALPINE
> Но сути всё это не меняет.
По сути получилось как раз то, что надо. Если делать строго, то действуют три матрицы A1, A2 и ей обратная (1/A2), которые должны гонять вектор V3 следующим образом.
V=A2*A1*(1/A2)*V3
Поскольку распределение по сфере равномерное, то обратный поворот не нужен и его можно выкинуть
V=A1*(1/A2)*V3
Обратная матрица отличается только знаком угла, поэтому её можно заменить просто матрицей поворота и при этом угол изменится.
V=A1*A2*V3
Получилось, что вектор откладывается в одну сторону и поворачивается вокруг поворачивающейся в противоположную сторону оси таким образом накрывая всю сферу. Ещё надо будет как-то сподобиться и проверить на равномерность аналитически, чего я пока не придумал.

#78
23:20, 18 авг. 2012

ALPINE
Еще раз, ты крутишь вектор в XY - это долгота, потом вокруг перпендикулярной ему оси - это получается широта, причем тут ось Z?

Во втором варианте ты крутишь вокруг произвольной оси в XY - тут не могу сообразить

#79
23:25, 18 авг. 2012

Aslan
> потом вокруг перпендикулярной ему оси - это получается широта
да, образовались полюса, поэтому кручу теперь не вокруг перпендикулярной оси, а вокруг случайной оси, но лежащей в плоскости XY.

#80
23:29, 18 авг. 2012

ALPINE
Все же нет, на любую малую окружность (параллельную XY) ложит с равной вероятностью, а надо пропорционально ее длине (cos(fi))
Способ же давно известен, вы хотите изобрести свой велосипед?

#81
23:39, 18 авг. 2012

Углубился в изучение глубокой теории. Интуиция подсказывает, что для случайной точки на двухмерном объекте достаточно двух случайных чисел, если рассматривать поверхность как двухмерное пространство. Доказать эту теорему я не могу ибо не Перельман. Возникает вопрос, зачем сначала задавать случайный вектор в плоскости XY, а потом поворачивать систему на случайный угол в противоположную сторону? Теоретически достаточно взять единичный вектор постоянного направления, например (1,0,0), потом повернуть систему rotz и повернуть в системе через rotx. Теперь полюс получается движущийся и скопление точкам не грозит, но надо поменять оба угла на полную окружность.

#82
10:29, 19 авг. 2012

Алексей Патрашов
> Интуиция подсказывает, что для случайной точки на двухмерном объекте достаточно
> двух случайных чисел
Так ты же это уже осуществил, способ №2:
http://www.gamedev.ru/code/forum/?id=165422&page=5#m63
И я потом сделал немного по другому:
http://www.gamedev.ru/code/forum/?id=165422&page=5#m70
А вообще ВСЕГДА достаточно одного случайного числа, ведь его можно делись на части (побитово).

#83
21:17, 19 авг. 2012

ALPINE
Случилось страшное! Вместо полярности опявилась экваториальная полосатость. На 100000 точек в телесный угол конической формы с косинусом угла относительно заданного направления 0,9 по разным осям получились такие результаты по направлениям.
(1,0,0) - 4096, (-1,0,0) - 4251
(0,1,0) - 5737, (0,-1,0) - 5723
(0,0,1) - 5638, (0,0,-1) - 5852
На полюсах вдоль иксов явный недобор, но врёт распределение несильно.

#84
23:43, 19 авг. 2012

ALPINE
Что значит повернуть ось Z вокруг вектора, вертится же вся система вместе с исходным вектором, лежащим в XY, или как?
а сам исходный вектор

Прошло более 3 лет
#85
15:43, 27 апр. 2016

На тот случай, если кому-то ещё нужно, для векторов любой размерности работает генерация через нормальное распределение.
1. Создать вектор со случайными координатами с нормальным распределением каждой координаты. У нормального распределения должно быть математическое ожидание 0 и стандартное отклонение 1, хотя величина стандартного отклонения несущественна.
2. Нормировать вектор.
3. Если нужна не вся сфера или плоскость или ещё какое пространство, то для соответствующих координат вектора поменять знак.

#86
18:29, 8 сен. 2016

Алексей Патрашов
Результат не будет равномерно распределен уже для отрезка
Я бы последовательно генерировал координаты, учитывая плотность распределения

#87
18:35, 8 сен. 2016

Aslan
Что значит "уже для отрезка"? Одномерное направление это две точки, +1 и -1, с ними всё будет ок.

#88
19:52, 8 сен. 2016

Aslan
> Результат не будет равномерно распределен уже для отрезка
Будет, там происходит понижение размерности. Из отрезка получаются две точки, из квадрата получается окружность, из куба - сфера и так далее.

#89
5:50, 9 сен. 2016

Алексей Патрашов
> Будет
Нет, равномерного распределения не будет.
На участках поверхности единичной сферы, расположенных близко к углам единичного куба, плотность точек будет выше. Очевидно же.

Страницы: 13 4 5 6 7 8 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.