Произвольно изменить трехмерный вектор - PullRequest
0 голосов
/ 26 ноября 2018

Учитывая вектор, существует ли простой способ возмущать его регулируемой случайной величиной, чтобы направить его в несколько ином направлении?Например, случайным образом отрегулируйте его на 0,1 радиана или на все радианы до 2piПроизвольная корректировка компонентов на самом деле не работает.

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

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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

Я реализовал его, и, похоже, он отлично работает.

0 голосов
/ 26 ноября 2018

Существует метод для явного создания перпендикулярного вектора.

Поиск компонентов с наибольшей и второй величинами.

Обменяйте эти компоненты и отменяйте самые большие.Сделать наименьший компонент ноль.Например, если для вектора V |y|>=|x|>=|z|, то вектор P=(-y, x, 0) перпендикулярен (отметьте произведение точек).

Чтобы сделать произвольный перпендикуляр, сгенерируйте также B = V x P, нормализуйте P и B и сделайтекомбинация

 R = L * P * Cos(t) + L * B * Sin(t) 

, где t - случайный угол в диапазоне 0..2*Pi, а L - длина, обеспечивающая угол отклонения tan(fi) = L / |V|

Теперь отклоненный вектор равен (с длиной, равнойисточник один).

D = (V + R) * |V|/|V+R|

Распределение неравномерно, если fi равномерно в диапазоне углов конуса.Кажется, преобразование ниже должно обеспечить равномерное распределение:

 L = V * tan(Sqrt(random(0..1))*FiCone)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...