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

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

Страницы: 1 2 3 4 58 Следующая »
#30
6:15, 9 авг. 2012
  Vector3 Sphere::getRandomPoint( bool surface ) const {
    float rnd1 = Math::Random( -1.0f, 1.0f );
    float rnd2 = Math::Random( -1.0f, 1.0f );

    float sqLen = Math::Sqr( rnd1 ) + Math::Sqr( rnd2 );

    if( sqLen > 1.0f ) {
      float rsqLen = Math::Rsq( sqLen );
      rnd1 *= rsqLen;
      rnd2 *= rsqLen;
      sqLen = 1.0f / rsqLen;
    }

    float rndSqrt = 2.0f * Math::Sqrt( 1.0f - Math::Sqr( rnd1 ) - Math::Sqr( rnd2 ) );

    Vector3 point;

    point = center + 
      Vector3( rnd1 * rndSqrt, rnd2 * rndSqrt, ( 1.0f - 2.0f * sqLen ) ) * radius;

    if( !surface ) {
      point = (point - center) * Math::Random( -1.0f, 1.0f ) + center;
    }

    return point;
  }

У меня есть такая функция, ей пользуюсь. Код понятен без комментариев. Для единичной сферы можно убрать центр и радиус, получится нормаль.


#31
8:08, 9 авг. 2012

Алексей Патрашов
facepalm

PlayerDark
что делает этот код помимо вычисления корня из отрицательного числа?

#32
8:21, 9 авг. 2012

Suslik
Я и не заметил. Исправил, теперь, думаю, должно работать.
Код просто не тестировался.

#33
8:33, 9 авг. 2012

я один не догоняю, почему это по задумке должно работать?

#34
10:00, 9 авг. 2012

мне  тож не нравиться... какой то избыточный код и одна из трех координат - непонятно чем занята...

#35
10:44, 9 авг. 2012

Если я правильно понял, приведенный код похож на (4) из http://www.math.niu.edu/~rusin/known-math/96/sph.rand, но вместо отбрасывания на шаге (с) величины просто урезаются и это приведет к неравномерности распределения.

#36
16:09, 9 авг. 2012

kipar
Да, это тот метод. Но величины не урезаются, а нормализуются.
Неравномерность будет? Но не слишком большая, как я понимаю. Если совсем чисто, то фцнкция должна рекурсивно вызывать себя, пока не выпадут нужные значения.

Вот что я в том документе нашел.

1) Choose standard normal variates x1,x2,x3,
put R=1/sqrt(x1^2+x2^2+x3^2) and return the point
(x1*R,x2*R,x3*R).
#37
18:43, 9 авг. 2012

а почему так то нельзя? совсем просто:

class tvect
{ public:
   tfloat x, y, z;
   ........
   void Rand(tfloat jtr = 1) {x = fRandom (-jtr,jtr); y = fRandom (-jtr,jtr); z = fRandom (-jtr,jtr);};
   ........
};

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

#38
19:13, 9 авг. 2012

Афтор:
1)

D3DXVECTOR3 rand_vec=D3DXVECTOR3(random(-1.0f,1.0f),random(-1.0f,1.0f),random(-1.0f,1.0f));
2)
D3DXVECTOR3 rand_vec=normalize(D3DXVECTOR3(random(),random(),random())); // не обработан случай когда длина вектора равна нулю  (т.е. x,y,z = 0);
#39
11:05, 10 авг. 2012

и правда репеат...

#40
12:47, 10 авг. 2012

PlayerDark
> Неравномерность будет? Но не слишком большая, как я понимаю. Если совсем чисто,
> то фцнкция должна рекурсивно вызывать себя, пока не выпадут нужные значения.
Зачем рекурсия, можно поступать как в том алгоритме. Т.е. никаких нормализаций, просто цикл.

И вообще я не понимаю, почему все игнорируют сообщение #19

#41
12:58, 10 авг. 2012

возможно эта задача решается только на термоядерном коллайдере... и только ровно в 14:38...
за секунду там можно будет получить столько случайных направлений, что потом за всю оставшуюся жизнь - не потратишь...

#42
18:24, 16 авг. 2012

А как получить почти случайное направление?
Или если выразиться по другому: получить почти неслучайное направление?
.. и опять не так )
Как в какой-то мере подтасовать результат этого генератора в сторону какого-то направления? Т.е. сконцентрировать скопление в заданном месте сферы?
.. хоть этот вопрос и не важен ваще, интересно поразмыслить

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

#43
22:28, 16 авг. 2012

ARtnaMed
Сделать конкретное направление(вектор), а потом от него "пускать влево-вправо" другие вектора.

#44
23:46, 16 авг. 2012

Алексей Патрашов
> Берём случайный угол и откладываем случайное расстояние.
Зачем на случайное расстояние?? Радиус R=1 и всё.

2D:

angle = rand(2*M_PI)
dx = cos(angle)
dy = sin(angle)

3D:

angle_lng = rand(2*M_PI)
angle_lat = 0.5*M_PI - rand(M_PI)
dx = cos(angle_lng) * cos(angle_lat)
dy = sin(angle_lng) * cos(angle_lat)
dz = sin(angle_lat)

Вроде ничего не напутал.

P.S. И это на предыдущей странице написано.

Страницы: 1 2 3 4 58 Следующая »
ПрограммированиеФорумОбщее

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