Pull to refresh

Comments 13

Хабр - торт. Спасибо за статью!

Замечательно! Отличный подход к повествованию. Отсылки и взгляд на знакомые структуры с обобщённой стороны очень помогают.

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

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

Можно и сейчас, и с типами сильно удобнее. Мне правда не хватило выразительной мощи системы типов в Scala и я пошёл по пути кодогенерации для какого-то подмножества типов и ограничился только одной алгеброй - проективной для 3д: https://github.com/Kright/ScalaGameMath/tree/master/pga3d/shared/src/main/scala/com/github/kright/pga3d

Классы, которые я решил выделить - скаляр, плоскость, идеальная плоскость, бивектор, бивектор с компонентами с e_w, бивектор с компонентами без e_w, кватернион, мотор, транслятор, тривектор, точка, вектор и точка в начале координат и мнимая единица (тут коллизия в названий, вектор это тривектор где e_xyz = 0, у точки e_xyz = 1, а у тривектора e_xyz произвольный).

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

Мне очень понравилось, что отдельные типы для точек и плоскостей реально содержат только по 3-4 переменных и код получается такой же эффективный без лишних элементов и вычислений. И система типов языка программирования начинает помогать, потому что теперь она чётко знает, что, например, при вращении плоскости кватернионом получится именно плоскость, а при вращении точки - снова точка.

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

Из минусов - для N типов потребуется сгенерировать N^2 бинарных операций и примерно половина из них дают ненулевой результат. Вполне возможно что в итоговой программе большая часть операций не пригодится.

В целом я очень доволен, поверх геометрической алгебры написал физический движок и он работает!
Вот мини-демонстрация: https://www.youtube.com/watch?v=wqt0ylxBqnU и часть кода для сил, инерции, движения и т.п.: https://github.com/Kright/ScalaGameMath/tree/master/pga3dphysics

Ещё заметил, что вы довольно лихо используете экспоненту, а я с ней какое-то время мучился, выводя эффективное вычисление экспоненты и логарифма и аккуратно обходя всякие случаи типа деления на ноль. Сложность вывода сильно зависит от количества генераторов в алгебре. Вот, например, экспонента: https://github.com/Kright/ScalaGameMath/blob/master/pga3d/shared/src/main/scala/com/github/kright/pga3d/Pga3dBivector.scala#L228

P.S. с размерностью действительно есть нюансы, потому что если элемент описывает одновременно и вращение и перемещение, то в нём хранятся и расстояние с какой-то размерностью и углы (вернее, скорее синусы и косинусы), но суть в том что они безразмерные. Как это строго математически описать - не очень понятно.

P.P.S. В Вашей статье очень понравилась идея, почему e_a e_b = -e_b e_a. Обычно это постулируют, хотя оказалось что к этому можно прийти из логических рассуждений и желаемых свойств.

P.P.P.S. Ещё вы написали, что пространство CL(0, 3, 0) распадается на линейное пространство над двумя кватернионами, но не будет ли возможен совершенно аналогичный "распад" кватернионов на линейное пространство над двумя комплексными числами? Если это так, то логичнее с комплексных чисел начинать и для кватерниона просто будет частный случай более общего.

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

С трансцендентными функциями, действительно, много возни, особых случаев, разных подходов. Это оказалось целой темой исследований. В результате получилась комбинация спец случаев, аппроксимаций Паде, рядов Тэйлора и метода Ньютона :)

Двойственность это свойство языка, или объекта, который он описывает?

Философский вопрос.. Я бы сказал, что это свойство языка выражать двойственность, как отношение между объектами. Объект сам по себе не может быть двойственным.

Впрочем, возможно, я не понял вашего вопроса.

Например, на проективной плоскости,
точки и прямые - двойственные объекты. Это их врождённое свойство безотносительно языка(проективной геометрии), или свойство проективной геометрии как языка описания точек и прямых(в другом языке описания(например евклидовой геометрии), двойственности уже не будет)?

В приведённом вами случае, двойственность точек и прямых это свойство геометрии, то есть, как вы выразились, языка. В проективном пространстве PR³ точкам будут двойственны плоскости, а на "проективной прямой" PR¹ точкам двойственны точки. Я как-то писал о двойственности в более широком контексте, но в менее техничном духе.

Я видел несколько другое представление кватернионов - а именно как подалгебры Клиффорда в трёхмерном пространстве, где i,j,k - это суть бивекторы.

Для бивекторов место i, j, k = e_1, e_2, e_12 можно использовать i, j, k = e_12, e_13, e_23. В итоге правила умножения для i j k точно такие же и всё остальное тоже идентично.

Спасибо за материал и пищу для ума!

Более, чем познавательно.

Очень рад что Вы снова с нами ! А то на дзене в последнее время читать стало невозможно, половины картинок нет. Да, Сергей, большая просьба. Не могли бы Вы выложить свою библиотеку algeometry на гитхаб ? Пытался скачать с hub.darcs, загрузка всё время падает.

Sign up to leave a comment.

Articles