Обновить
195
0.9

Программист

Отправить сообщение

Можно. Например, кватернион - это экспонента бивектора.
q = exp(b) = 1 + b + b2/2! + b3/3! + ... = cos(|b|) + b * sin(|b|) / |b|

И например если писать уравнения движения тел вида q y q{-1}, то их можно дифференцировать, единственное важное отличие - из-за некоммутативности производная "слева" и "справа" будут нести разный смысл. Типа переход q -> (1 + db) q это добавление вращения во внейшей системе отсчёта (после примненения q), а переход q -> q (1 + db) это добавление вращения в "локальной" СО, поверх которого применят q, и эти db будут разные

В линейной алгебре, когда вводят векторное произведение для 3д, есть понятие "правого базиса" и "левого базиса", потому что определить его можно и так и сяк. И ещё для чего-то кроме 3д векторное произведение не работает (ни для 2д, ни для 4д), потому что только в 3д у нас три степени свободы перемещения и 3 степени свободы вращения и это позволяет нарисовать "ось вращения". В 2д будет 2 перемещения и 1 вращение, в 4д - 4 перемещения и 6 вращений.

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

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

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

Вы не думали, что человек после института в 24 года может хотеть свою машину, свою квартиру, завести семью/ребёнка (и жена тогда год-два не будет работать) и он сам в каких-то случаях может помогать родителям. А ему предлагают зп, на которую он сможет снимать аж целую однушку и жить с помощью родителей без возможности на что-либо накопить. Да, от безысходности можно и так поработать. Только потом не надо удивляться, что мотивации работать нет, рождемость низкая и люди уезжают кто куда.

Проблема ещё в том, что доллар обесценивается, и если когда-то 10 тысяч долларов это было много, то сейчас топовый макбук может стоить 7.5к. Ещё несколько лет роста цен и даже его придётся декларировать.

Да можно и не стирать, Стивен Хокинг мог просто сказать что никого не видел независимо от того, сколько людей было на вечеринке.

Моему другу как-то приснилось, что он работал в Яндексе много лет назад и самое забавное, что написание кода в текстовом редакторе "без ничего" там часто попадалось. Типа есть какой-нибудь внутренний сервис и буквально в браузере в текстовое поле надо вставить код с функцией, нажать кнопку запуска (код кастомизирует что именно и как запускается), а потом через несколько минут в браузере же увидеть первые несколько строчек лога ошибки. Потому что сервис, например, ждёт строку на втором питоне вместо третьего.

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

Пользуясь случаем поинтересуюсь - используется ли сейчас где-нибудь внутри Яндекса второй питон?

Вы эту статью читали или сразу пришли в комментарии?

Это будет е1 * е3
e2 свернутся в единицу.
Ещё ei ej = - ej ei для i != j поэтому можно менять порядок элементов

Умножать геометрическим произведением и смотреть на всё вместе как на мультивектор.

Геометрическое произведение бивекторов даст сумму скаляра и бивектора.

Там два в степени количества генераторов.

Можно. Комплексные числа это частный случай геометрической алгебры, когда генератор только один.
Можно и складывать, и умножать, и экспоненциировать и вообще любую функцию представить в виде ряда Тейлора и вместо числа подставить туда мультивектор.

Оно замкнутно.

Допустим, есть генераторы e1, e2, e3.

Из них можно собрать 8 комбинаций:

  1. скаляр (без генераторов)

  2. векторы (генераторы e1, e2, e3)

  3. бивекторы (е1*е2, e1*e3, e2*e3)

  4. псевдоскаляр (e1*e2*e3)

Больше ничего получить невозможно, потому что 1 = e1*e1 = e2*e2 = e3*e3 и при повторении генераторов они схлопываются обратно в скаляр.

В общем случае в алгебре с тремя генераторами мультивектор будет иметь восемь компонент и это всё будет замкнуто.

Так же, как в комплексных числах a + bi складывают вещественную и мнимую часть.
Только тут "дополнительных" частей много разных.

Да, в компоненте ww лежат граммы, в компонентах wx, wy, wz граммы на сантиметры или ещё как, в xx, xy... - граммы на квадратные сантиметры.

В мультвекторе в разных компонентах разные размерности. Иначе никак оно всё в одну сущность не поместится.

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

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

Так в том-то и дело, что нет!

Будет сущность для инерции (по-сути тоже тензор), которая вмещает и тензор инерции и массу. Так же будет сущность, которая вмещает и силу и момент.
Будет формула преобразования, которая будет действовать на всё сразу!

Вот мой код для инерции: https://github.com/Kright/ScalaGameMath/blob/master/pga3dphysics/shared/src/main/scala/com/github/kright/pga3dphysics/Pga3dInertiaSummable.scala

10 чисел, в которых закодирован и тензор инерции, и масса, и положение центра масс. И что прикольно, для сложения нескольких тел (даже с центрами масс в разных местах), мне достаточно просто покомпонентно сложить.

Если математически смотреть, то там будет симметричная матрица 6x6, в которой два блока 3х3 - один с тензором инерции и ещё один 3x3, где диагональные элементы это масса тела, потому что "масса" для перемещения вдоль разных осей одна и та же.

Здесь непонятно. Тогда другие вектора - тоже зеркала или всё же отражаемые объекты?..

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

Но вообще в геометрической алгебре скорость это бивектор. А экспонента скорости, умноженной на время даст трансформацию, R = exp(v * t).

Будет отличаться в мелочах, но примерно так же.
Но не надо - запись (dV + R a R^{-1}) просто неудобная - комбинировать несколько трансформаций сложно, сделать что-то типа дифференцирования или нахождения логарифма тоже неудобно.

Например, в plane-based алгебре бивектор скорости вмещает в себя сразу и линейную и вращательные скорости тела. Если разделять линейное и вращательное на две сущности, то сразу удваивается количество формул и количество мест, где можно ошибиться.

Не советую читать New Foundations for Classical Mechanics. Там геометрическая алгебра используется только для вращений, и в итоге там какой-то микс геометрической алгебры и обычных формул. Оно и сложно и не сильно понятно зачем. Книга вышла в 1986 году и на мой взгляд устарела.

Лучше сразу вот эту книжку читать про plane-based геометрическую алгебру: https://bivector.net/PGADYN.html

Например, если надо тело подвинуть и повращать, Хестенец напишет (dV + R a R^{-1}) и будет это тащить через все дальнейшие формулы, хотя plane-based алгебра позволит это записать как M a M^{-1} и работать с такой формулой на порядок проще.

Значит, ab — это в точности обратный элемент к ba! То есть ab = (ba)⁻¹ = R⁻¹.

Наша формула для двух отражений (то есть, для поворота!) превращается в нечто невероятно элегантное.

Мне кажется, надо всё-таки ввести операцию reverse и явно про неё сказать (та самая, которая меняет порядок векторов на обратный).

Потому что, например, кватернион это скаляр + бивектор, и reverse для кватерниона меняет знак только для бивекторной части, не трогая скаляр. И что важно - это тривиальная замена знаков, а не что-то потенциально сложное типа нахождения обратной матрицы.

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

P.S. И ещё очень часто любят вводить дуальность как домножение на I - но в общем случае это некорректно. Лучше вводить дуальный элемент как тот, который при домножении на исходный даст I, типа ab = I.
Потому что можно взять генератор, у которого квадрат будет равен нулю, и формула вида aI будет давать не тот результат. А генератор с квадратом-нулём как раз будет нужен для представления линейных перемещений.

На самом деле очень много всего даёт, причём именно в плане простоты и универсальности.

Классическое описание с векторами резко теряет всю простоту, если перейти к трёхмерным случаям с вращением.

Например, в геометрической алгебре, есть вектора, плоскости (внешнее произведение двух векторов) и точки (трёх векторов). Отражение относительно вектора работает одинаково для всего.
Причём если шагнуть в сторону физики - то сила это бивектор (линия), скорость это тоже бивектор (тоже линия, причём в случае вращения это будет ось вращения), и эти штуки аддитивны и тоже прекрасно отражаются/вращаются по тем же самым формулам.
И кстати отражение относительно точки - это комбинация трёх отражений.

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

А ещё, что очень красиво, можно взять проективную геометрическую алгебру, там кроме вращений ещё будут перемещения (и на мой взгляд использовать надо именно её, вот там раскрываются все возможности).

Вот я писал заметки когда разбирался: https://kright.github.io/2024/06/02/Plane-based-геометрическая-алгебра-для-описания-движения-тел.html

И в итоге я написал свою библиотеку: https://github.com/Kright/ScalaGameMath/tree/master/pga3d
В процессе разобрался со всем ещё лучше и мне очень понравилось.

И поверх этого всего написал физический движок, вот можно посмотреть на симуляцию подвески и трансмиссии автомобиля, каждый рычаг подвески честно симулируется: https://www.youtube.com/watch?v=wqt0ylxBqnU

Сейчас переписываю библиотеку и физический движок на C++ и хочу использовать их в Unreal Engine.

Информация

В рейтинге
1 836-й
Откуда
Белград, Сербия
Зарегистрирован
Активность

Специализация

Software Developer, ML Engineer
Kotlin
Scala
Java
Python
Neural networks
Algorithms and data structures
Android development
OpenGL