Как использовать 4d роторы

Я пытаюсь создать среду 4D, похожую на Miegakure.

У меня проблемы с пониманием того, как представлять повороты. Создатель Miegakure написал эту небольшую статью, объясняющую, что он создал класс для 4d роторов. http://marctenbosch.com/news/2011/05/4d-rotations-and-the-4d-equivalent-of-quaternions/

Как я могу реализовать функции этого класса? В частности, функции для поворота векторов и других роторов и получения обратной?

Буду признателен за некоторые примеры псевдокодов. Большое спасибо всем, кто не может ответить.

2 ответа

Решение

Решение вращения вокруг произвольного вектора сделает вас безумным в 4D. Да, для этого существуют уравнения, такие как формула Эйлера – Родригеса для расширения трехмерных вращений до 4D, но все они должны решать систему уравнений, и ее использование на самом деле не является интуитивно понятным для нас в 4D.

Вместо этого я использую вращение параллельно плоскостям (аналогично вращению вокруг главных осей в 3D). В 4D их 6 XY,YZ,ZX,XW,YW,ZW так что просто создайте матрицы вращения (похожие на 3D). Я использую 5x5 однородные матрицы преобразования для 4D, поэтому вращение выглядит так:

xy: 
( c , s ,0.0,0.0,0.0)
(-s , c ,0.0,0.0,0.0)
(0.0,0.0,1.0,0.0,0.0)
(0.0,0.0,0.0,1.0,0.0)
(0.0,0.0,0.0,0.0,1.0)
yz: 
(1.0,0.0,0.0,0.0,0.0)
(0.0, c , s ,0.0,0.0)
(0.0,-s , c ,0.0,0.0)
(0.0,0.0,0.0,1.0,0.0)
(0.0,0.0,0.0,0.0,1.0)
zx:
( c ,0.0,-s ,0.0,0.0)
(0.0,1.0,0.0,0.0,0.0)
( s ,0.0, c ,0.0,0.0)
(0.0,0.0,0.0,1.0,0.0)
(0.0,0.0,0.0,0.0,1.0)
xw:
( c ,0.0,0.0, s ,0.0)
(0.0,1.0,0.0,0.0,0.0)
(0.0,0.0,1.0,0.0,0.0)
(-s ,0.0,0.0, c ,0.0)
(0.0,0.0,0.0,0.0,1.0)
yw:
(1.0,0.0,0.0,0.0,0.0)
(0.0, c ,0.0,-s ,0.0)
(0.0,0.0,1.0,0.0,0.0)
(0.0, s ,0.0, c ,0.0)
(0.0,0.0,0.0,0.0,1.0)
zw:
(1.0,0.0,0.0,0.0,0.0)
(0.0,1.0,0.0,0.0,0.0)
(0.0,0.0, c ,-s ,0.0)
(0.0,0.0, s , c ,0.0)
(0.0,0.0,0.0,0.0,1.0)

куда c=cos(a),s=sin(a) а также a это угол поворота. Ось вращения проходит через начало системы координат (0,0,0,0), Для получения дополнительной информации взгляните на это:

Наиболее распространенный способ представления многовекторов goemetric algebra (включая роторы) в компьютере - через массив коэффициентов, по одному для каждого базового элемента алгебры канонической формы (лезвие канонического базиса), т.е. для четырехмерного базисного пространства у вас будет 2^4-мерная алгебра и 2^4-мерный массив коэффициентов. Альтернативный, но, вероятно, более быстрый способ их представления заключается в динамическом изменении размера списка, в котором каждый элемент содержит индекс блейда и коэффициент связанного блейда. В этом случае умножение двух мультивекторов будет использовать только ненулевые базисные блейды и поэтому должно быть алгоритмически дешевле и легче при использовании памяти.

С точки зрения практического использования я обнаружил, что проще всего начать играть с геометрической алгеброй, вероятно, на python с https://github.com/pygae/clifford. Полный отказ от ответственности Я использую эту библиотеку ежедневно и активно помогаю ей. Эта библиотека использует метод плоского массива коэффициентов. С этой библиотекой Python вы можете применять 4D роторы через сэндвич-продукт и делать реверсию (инверсию ротора) с помощью оператора тильды:

# Create a 4D geometric algebra with euclidean metric
from clifford.g4 import *

# Create a rotor
R = layout.randomRotor()

# Create a vector to rotate
V = layout.randomV()

# Apply the rotor to the vector
V2 = R*V*~R

Конкретное определение геометрического произведения и обратного для многовекторов из N-мерной геометрической алгебры можно найти в главе 4 "Геометрическая алгебра для физиков" Криса Дорана и Энтони Ласенби.

Хорошая эталонная реализация C++ GA для N-мерных GA, использующих подход списка элементов, может быть найдена в книге Лео Дорста "Геометрическая алгебра для физиков" или на его веб-сайте: http://www.geometricalgebra.net/code.html. В целом, это большой ресурс для GA, особенно для конформной модели и численных реализаций и проблем.

Я смог использовать Rotors после того, как узнал больше по этому вопросу благодаря этой серии статей о геометрической алгебре на YouTube: https://www.youtube.com/watch?v=PNlgMPzj-7Q&list=PLpzmRsG7u_gqaTo_vEseQ7U8KFvtiJY4K

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

Если вы уже знаете о умножении кватернионов, умножение ротора не будет отличаться, а единицы кватернионов i, j, k аналогичны базисным бивекторам геометрической алгебры: e12, e13, e23

Таким образом, ротор в 4D будет (A + B*e12 + C*e13 + D*e14 + E*e23 + F*e24 + G*e34 + H*e1234).

Таблицу, показывающую, как умножить эти единицы, можно найти на этой странице: http://www.euclideanspace.com/maths/algebra/clifford/d4/arithmetic/index.htm

Другие вопросы по тегам