3D вращение без тригонометрии?

#math #vector

#математика #вектор

Вопрос:

Я разрабатываю алгоритм поворота вокруг оси в 3 измерениях. Мои входные данные

  • ось, вокруг которой я вращаюсь, как вектор от моей центральной точки
  • центральная точка (очевидно)
  • угол, вокруг которого я хочу повернуть
  • моя текущая позиция

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

РЕДАКТИРОВАТЬ: есть ли способ, которым я мог бы поворачиваться на пи / 4 радиана (45 градусов) каждый раз, а не на введенный угол тета? Это может немного упростить ситуацию, я не знаю.

Комментарии:

1. Какие векторные операции у вас есть?

2. У меня есть крест, точка, сложение, вычитание и нормализация.

3. В этом случае у меня довольно сильное ощущение, что вы не сможете реализовать вращение без использования тригонометрии в той или иной форме. Возможно, вам удастся обойтись одной оценкой тригонометрической функции, косинусом (или синусом) угла поворота, но у вас должен быть хотя бы один. Единственный случай, в котором вы могли бы обойтись без этого, был бы, если бы у вас была доступна векторная операция «вращение» (и даже тогда, вероятно, она выполняла бы тригонометрию за кулисами).

4. Есть ли способ найти перпендикуляр и разрезать его? Возможно?

5. Для этого вам тоже нужны тригонометрические функции.

Ответ №1:

Вращения по своей сути хорошо описаны  sinи  потому что.

Это удобный трюк, заключающийся в том, что единичные кватернионы прекрасно представляют трехмерные вращения так же хорошо, как (и в некоторых смыслах, лучше, чем) матрицы вращения. Преобразование поворота на угол  тетавокруг нормальной оси<img alt="hat n =left<x, y, z right>" src="https://chart.googleapis.com/chart?cht=txamp;chl=hat n=left»/>, где x ^ 2   y ^ 2   z ^ 2 = 1, требует немного тригонометрии : left(cosleft(frac12thetaright)right) left(xsinleft(frac12thetaright)right)i left(ysinleft(frac12thetaright)right)j left(z  sin  left(frac12  theta  right)right)k.

Но с этого момента это простая арифметика. Кватернион q = a   bi   cj   dkможет быть непосредственно применен для поворота вектора q (xi   yj   zk) q ^ {-1}или преобразован в матрицу вращения left(begin{matrix}a ^ 2   b ^ 2-c ^ 2-d ^ 2amp;2bc-2adamp; 2bd   2ac  2bc   2adamp;a ^ 2-b ^ 2   c ^ 2-d ^ 2amp;2cd-2ab  2bd-2acamp;2cd   2abamp;a ^ 2-b ^ 2-c ^ 2   d ^ 2 end{матрица}  справа).

Конечно, это вращение вокруг начала координат. Чтобы вращаться вокруг произвольной точки oв пространстве, просто переведите by -oв начало координат, поверните, затем переведите by oдля возврата.

Комментарии:

1. Отлично! Кватернионы действительно очень полезны при описании 3D вращений!

Ответ №2:

Комментарии:

1. В этих матричных операциях используется тригонометрия (хотя я не вижу способа сделать это каким-либо разумным образом без нее).

2. Матрицы вращения по-прежнему используют sin() и cos(). Я действительно не вижу ничего, что связано с вращением, избегающим этих вычислений.

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

Ответ №3:

Если это какая-то глупая домашняя задача, вы можете использовать аппроксимацию рядов Тейлора функций синуса / консина. Я думаю, что вопрос о том, считается ли это тригонометрией или нет, является предметом обсуждения. Затем вы можете использовать эти значения в матрице вращения или quarternion, если хотите использовать векторные операции.

Но опять же, для этого нет практической причины.

Комментарии:

1. Этот вопрос просто для того, чтобы посмотреть, есть ли какой-либо способ избежать тригонометрии. Я знаю о серии Тейлора, я просто пытаюсь понять, есть ли какой-либо другой способ.

Ответ №4:

Существуют ли другие методы, которые не используют тригонометрические функции? Возможно, но нет известных эффективных, Общих (т. Е. Для произвольных углов) Способов выполнения вращений без использования тригонометрических функций.

Однако, основываясь на вашем редактировании, вы можете предварительно вычислить sin и cos для интересующего вас набора углов и сохранить их в справочной таблице. В таких обстоятельствах вам не нужно ограничиваться π/4 приращениями, но вы можете выполнять π/256 или π/1024 увеличивать, если хотите. Кроме того, вам не нужны две таблицы, поскольку cos(θ) = sin(θ π/2) .

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

Затем вы должны использовать преобразование на основе матрицы или кватерниона для вычисления повернутого вектора.

Это будет быстрее, чем вычисление sin и cos для общих углов, хотя и потребует некоторого дополнительного пространства, а также приведет к снижению точности. Но если это удовлетворяет ваши потребности…

Ответ №5:

Есть более дешевый способ, чем матрицы, я думаю, у меня получилось суммировать количество сумматоров.

Прямоугольник вектора по периметру так же хорош, как угол, если вы вставляете разделы размером с прямоугольник. (это только двоичный сдвиг, если его степень равна 2.)

Тогда это будет «поворот коробки», затем просто используйте боковой отчет, чтобы показать, как далеко вы продвинулись бы по диагонали, затем вы можете разделить его на столько градиентов, форму круга.

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

Ответ №6:

Возможно ли вращение без тригонометрии? ДА.

Полезно ли вращать без использования тригонометрии? Вероятно, нет.


Первый вариант — это решение на уровне проблемы: измените свою систему координат на сферические или цилиндрические координаты.

Поскольку вы вращаетесь вокруг оси, цилиндрические координаты формы (alpha, radius, x3) будут работать.

Называя свою центральную точку O (для начала координат) и точку для поворота P , вы можете получить вектор между ними v=P-O . Вы также знаете вектор нормали n вашей плоскости вращения (вектор, вокруг которого вы вращаетесь). С помощью этого вы можете получить компоненты v , которые параллельны и ортогональны n использованию векторной проекции.

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

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

Используя dot(.,.) для обозначения скалярного произведения, в коде это выглядело бы примерно так

 v_parallel = dot(v, n) / dot(n, n) * n
radius = norm(v - v_parallel)
x3 = norm(v_parallel)

new_axis = (v - v_parallel) / norm(v - v_parallel)
P_polar = (0, radius, x3)

# P rotated by 90 degrees
P_polar = (pi/2, radius, x3)

# P rotated by -10 degrees
P_polar = (-pi/36, radius, x3)
  

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


Другой подход исходит из классного наблюдения, что вы можете описать любое плоское вращение, используя два отражения вдоль двух заданных осей (представленных двумя векторами). Плоскость вращения — это плоскость, которая вращается двумя векторами, а угол поворота в два раза больше угла между двумя векторами.

Вы можете отразить вектор, используя векторную проекцию сверху; следовательно, вы можете выполнить весь процесс без тригонометрии, если вы знаете два вектора (назовем их x1 и x2 ).

 tmp = v - 2 * dot(v, x1) / dot(x1, x1) * x1
v_rotated = tmp - 2 * dot(tmp, x2) / dot(x2, x2) * x2
  

Затем проблема превращается в нахождение двух векторов, ортогональных n и имеющих охватывающий угол alpha/2 . Как это сделать, зависит от вашей проблемы. Для произвольной альфы это снова тот момент, когда вы не можете уклониться от тригонометрической пули; следовательно, это снова возможно, но, возможно, не так жизнеспособно на практике.

Ответ №7:

Похоже, что с помощью Mathematica мы можем вращать точку вокруг вектора без Sin / Cos, если вы хотите указать величину поворота в виде числа от -1 до 1, а не угла в радианах.

Приведенное ниже начинается с преобразования вращения точки {x, y, z} в Mathematica вокруг вектора {u, v, w} на c радиан (который содержит много экземпляров Cos [c] и Sin [c]). Затем он заменяет все Cos [c] на «c», а Sin [c] на Sqrt [1-c ^ 2] (тригонометрическое тождество для Sin в терминах Cos). Все упрощается в предположении, что вектор вращения нормализован. Результирующее уравнение создает повернутую точку без каких-либо тригонометрических операций.

Скриншот, показывающий команду Mathematica, создающую уравнение вращения

Примечание: поскольку c находится в диапазоне от -1 до 1, точка будет вращаться только через половину круга, другая половина вращения может быть достигнута путем переключения знаков на {u, v, w} .

Комментарии:

1. Вот текст / CForm для упрощения вырезания / вставки. (x (-1 c) * Мощность (v, 2) * x (-1 c) * Мощность (w, 2) * x Sqrt(1 — Мощность (c, 2))*(- (w y) v z) — (-1 c) * u *(vy wz), Sqrt(1 — мощность ( c, 2)) * w x uv *(x — cx) cy Мощность (v, 2) * ( y — cy) — Sqrt (1 — мощность (c, 2)) * u z v w *(z — c z), -(Sqrt(1 — мощность (c, 2)) * v x) u w *(x — c x) Sqrt(1 — мощность (c, 2))* uy v w * (y — c y) c z Мощность (w, 2) * (z — c z))