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

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

Страницы: 13 4 5 68 Следующая »
#45
23:54, 16 авг. 2012

ALPINE
Плотность точек у полюсов стремится к бесконечности.


#46
0:04, 17 авг. 2012

ALPINE
> Зачем на случайное расстояние??
Это я пытался вспомнить, как равномерно заполнить случайными точками круг. Потом перечитал FAQ, там написано достаточно косноязычно, не сразу понял и начал сначала. 3D будет глючить полюсами. В FAQ как раз пример с изменением распределения, чтобы точки от полюсов разогнать, а первый пример с вылавливанием равномерно распределённых в пространстве точек двумя сферами так, чтобы точка была между ними. Остальные примеры по ссылке я не разобрал и Кнута я далеко запрятал. Есть численные методы с очень мало отличающимися от аналитических результатами. Тот же спирограф иногда рисует почти прямые линии, а выпрямительный механизм Чебышева превращает кривую траекторию почти в прямую.

#47
0:40, 17 авг. 2012

выбрать случайный fi от 0 до 2*PI, z от -1 до 1
нормировать вектор (cos(fi),sin(fi),z)

#48
1:15, 17 авг. 2012

Aslan
> выбрать случайный fi от 0 до 2*PI, z от -1 до 1, нормировать вектор (cos(fi),sin(fi),z)
Всё равно скопления на полюсах. Чтобы их разогнать надо использовать функцию с d(x^2+y^2)/dz стремящейся к бесконечности, а тут в знаменателе корень из суммы квадратов.

#49
11:07, 17 авг. 2012

repeat
>>Сделать конкретное направление(вектор), а потом от него "пускать влево-вправо" другие вектора.
Вы утверждаете, что генерация произвольного отклонения чем-то отличается от генерации произвольного направления?
Не думаю, это та же задача, только вместо
>> Как в какой-то мере подтасовать результат этого генератора в сторону какого-то направления?
теперь нужно подтасовать результат этого генератора в сторону минимального отклонения.

#50
11:19, 17 авг. 2012

ARtnaMed
> Вы утверждаете, что генерация произвольного отклонения чем-то отличается от
> генерации произвольного направления?
> Не думаю, это та же задача, только вместо
Произвольное отклонение может иметься ввиду в 2D, в плоскости, перпендикулярной начальному направлению, это уже совершенно другая задача - просто выбор случайного угла от 0 до 2*Pi.

#51
12:22, 17 авг. 2012

ARtnaMed
Задай правильный вопрос - получишь правильный ответ!

#52
13:21, 17 авг. 2012

Просто чтобы было понятно что
- самые простые решения не всегда правильные
- и что неравномерность существенна

1) рандомные 2 угла в полярнос системе координат
RandomDirection_Polar | Как получить случайное направление?

2) рандомный вектор в кубе
RandomDirection_InCube | Как получить случайное направление?


3) все исчезает если для (1) правильно проапдейтить Z, а для (2) выкидывать вектор если его длинна(до нормализации) больше 1.0

#53
13:23, 17 авг. 2012

repeat
>>Сделать конкретное направление(вектор), а потом от него "пускать влево-вправо" другие вектора.
Это не приведет к тому, что направления приближенных к этому конкретному направлению станет больше.

Mikle
2d or not 2d не важно
>> Т.е. сконцентрировать скопление в заданном месте сферы?
Даже на примере 2Д, относительность отклонения на распределение влиять ну просто не может логически.
>> это уже совершенно другая задача
Я про задачу равномерного распределения. Определяя начальное направление мы задаем только смещение, которое никак не влияет на распределение.

В равномерном варианте мы генерируем произвольный угол.
От того, что мы его сдвинем на какой-либо другой угол, распределение останется таким же.
Ну рассмотрите 1Д, линия, рандом равномерно выберет любую точку на линии. Если мы будем сдвигать этот рандом на константу, то вероятности того, что рандом будет ближе к значению этой константы не возрастет.

repeat
>> Задай правильный вопрос - получишь правильный ответ!
Все равно я не думаю что вы дали правильный ответ :-)

achumack
Есть идеи как взять такие скопления под контроль?

#54
13:24, 17 авг. 2012

ПС: если надо "нерандомное" распределение с приоритетом на какое-то направление, то дешево и сердито

NewDirection = normalize(RandomDirection() + aaa*DesiredDirection); 

или

NewDirection = normalize((1-aaa)*RandomDirection() + aaa*DesiredDirection); 

где ааа - коэфициент 0..1

(могу картинок нагенерить что получается)

ПС2: если надо рандомное направление в секторе - то это другая задача

#55
13:35, 17 авг. 2012

achumack
Впринципе можно не ограничиваться 0..1, даже если будет 2, вероятность (рандом == DesiredDirection) не будет равна 1.
А идея хорошая. Может с углами попробовать поиграться

NewDirection = normalize((1-aaa)*RandomDirection() + aaa*DesiredDirection); 

Сначала думал, думал, обрадовался, а потом понял почему я так долго думал :-)
Мы можем нормализировать нулевое направление
0,5*(-1)+0,5*(1)
Внутренняя сумма вообще сдвигает пространство точек с поверхности сферы. Грубо, зато сердито :-)

#56
13:42, 17 авг. 2012

ARtnaMed
> Я про задачу равномерного распределения. Определяя начальное направление мы
> задаем только смещение, которое никак не влияет на распределение.
А я писал про конкретный локальный вопрос, что "генерация произвольного отклонения чем-то отличается от генерации произвольного направления". Да, отличается.

#57
14:59, 17 авг. 2012

Алексей Патрашов
>> выбрать случайный fi от 0 до 2*PI, z от -1 до 1, нормировать вектор (cos(fi),sin(fi),z)
> Всё равно скопления на полюсах. Чтобы их разогнать надо использовать функцию с d(x^2+y^2)/dz стремящейся к бесконечности, а тут в знаменателе корень
> из суммы квадратов.
Проекция сферы на описанный цилиндр сохраняет площади, этим и пользуюсь
Проверенно )

#58
15:34, 17 авг. 2012

Mikle
> Плотность точек у полюсов стремится к бесконечности.
Блин, и правда. Продолжаю думать

#59
15:52, 17 авг. 2012

=A=L=X=
> Все уже забыли что эта тема неоднократно муссировалась на форуме что её даже
> выделили в отдельный FAQ?
> http://www.gamedev.ru/faq/?id=148

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

вот код

vec3 randsphere()
{
  while(true)
  {
    vec3 p = vec3( rand(), rand(), rand() )
    if ( abs( p.length() - RANDMAX/2 ) < 100 )
      return p.normalize();
  }
}

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

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