Можно. Комплексные числа это частный случай геометрической алгебры, когда генератор только один. Можно и складывать, и умножать, и экспоненциировать и вообще любую функцию представить в виде ряда Тейлора и вместо числа подставить туда мультивектор.
Да, в компоненте ww лежат граммы, в компонентах wx, wy, wz граммы на сантиметры или ещё как, в xx, xy... - граммы на квадратные сантиметры.
В мультвекторе в разных компонентах разные размерности. Иначе никак оно всё в одну сущность не поместится.
Понимаю, пускай зависят от ориентации. Я это представление использую, если надо посчитать суммарную инерцию нескольких жёстко соединённых тел. Представление с отдельным хранением трансформации и диагональным видом у меня тоже есть.
Так все равно и размерности разные и законы преобразования при переходе к другим системам отсчета. Динамика скорости определяется массой и силой, а вращения, тензором инерции и приложеным моментом.
Так в том-то и дело, что нет!
Будет сущность для инерции (по-сути тоже тензор), которая вмещает и тензор инерции и массу. Так же будет сущность, которая вмещает и силу и момент. Будет формула преобразования, которая будет действовать на всё сразу!
10 чисел, в которых закодирован и тензор инерции, и масса, и положение центра масс. И что прикольно, для сложения нескольких тел (даже с центрами масс в разных местах), мне достаточно просто покомпонентно сложить.
Если математически смотреть, то там будет симметричная матрица 6x6, в которой два блока 3х3 - один с тензором инерции и ещё один 3x3, где диагональные элементы это масса тела, потому что "масса" для перемещения вдоль разных осей одна и та же.
Здесь непонятно. Тогда другие вектора - тоже зеркала или всё же отражаемые объекты?..
Тут примерно как с числами. Мы берём и говорим "Чисто N - количество яблок у Васи". Или говорим, что "Число P - курс доллара к рублю". Мы в каждом конкретном случае вкладываем в числа какой-то смысл и не будем делать бессмысленные операции типа сложения яблок с курсом доллара, хотя математика нам не запрещает. Точно так же для конкретного вектора мы можем держать в уме что "это отражение, записанное в виде вектора"
Но вообще в геометрической алгебре скорость это бивектор. А экспонента скорости, умноженной на время даст трансформацию, R = exp(v * t).
Будет отличаться в мелочах, но примерно так же. Но не надо - запись (dV + R a R^{-1}) просто неудобная - комбинировать несколько трансформаций сложно, сделать что-то типа дифференцирования или нахождения логарифма тоже неудобно.
Например, в plane-based алгебре бивектор скорости вмещает в себя сразу и линейную и вращательные скорости тела. Если разделять линейное и вращательное на две сущности, то сразу удваивается количество формул и количество мест, где можно ошибиться.
Не советую читать New Foundations for Classical Mechanics. Там геометрическая алгебра используется только для вращений, и в итоге там какой-то микс геометрической алгебры и обычных формул. Оно и сложно и не сильно понятно зачем. Книга вышла в 1986 году и на мой взгляд устарела.
Например, если надо тело подвинуть и повращать, Хестенец напишет (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://www.youtube.com/watch?v=wqt0ylxBqnU
Сейчас переписываю библиотеку и физический движок на C++ и хочу использовать их в Unreal Engine.
Оно чем-то мешает? Никто не заставляет пользоваться всеми фичами языка. Более того, мне трудно представить человека, который вообще все фичи разом использует, уверен, что большинство разработчиков не знают или не помнят и половины — это им совершенно не мешает жить. Вот совсем. Никаких проблем с этим нет.
Точно мешает. компилятор, IDE, статический анализ кода, всякие тулы вокруг языка просто обязаны поддержать все фичи и краевые случаи языка. Это всё становится делать сложнее и результат либо дороже, либо хуже.
И если проект на несколько человек (а ещё "лучше" - легаси), то там кто-то мог наиспользовать всяких незнакомых фич и потом с этим придётся жить. Это получится как с С++ - вполне можно написать хороший код на нём "с нуля", но если придётся разбираться в чужом, то иногда без поллитра не разберёшься.
P.S. Ещё добавлю что есть Scala, где разработчики пошли по пути гибкости языка и возможности писать почти любую языковую конструкцию внутри любой другой - получилось просто и очень мощно. Например, можно объявить функцию внутри функции - это не "специальная фича языка", это просто поддержа вложенности. Можно вообще объявить класс внутри функции внутри объекта внутри класса - и это всё скомпилируется. Отдельного понятия для "статических локальных функций" нет, в нём нет смысла.
Я ошибся, надо (rand5() - 1) + 5 * (rand5() - 1). Чтобы получилась сетка с 25 равномерными значениями. И ещё условие отсечения можно поменять на n >= 21 для большей эффективности.
Не только России. Если посмотреть половозрастные пирамиды в Европе, то там много людей предпенсионного и пенсионного возраста и мало молодых. В итоге получается, что либо пенсии будут небольшими, либо налоги большие.
Хорошо влияет - 2FA SMS доверять и не надо. Телефонный номер человеку не принадлежит, его может отобрать оператор связи за неиспользование, сим карта может выйти из строя, злоумышленник может зарегистрировать новую сим-карту или вообще сделать атаку с роумингом в какой-нибудь африканской стране и смс уйдёт туда. И вообще это получается единая точка отказа - при потере номера резко станет недоступным всё, что на него завязано.
Кстати, может быть и отменят. В экономике есть кривая сбора налогов - сначала с их ростом увеличиваются поступления, а потом при превышении какого-то порога экономика всё сильнее уходит в тень и дальнейший рост налогов только снижает поступления. Вполне может оказаться, что кто-нибудь в будущем посчитатет и поймёт что их можно снизить и при этом собрать больше. Сейчас резко нужны деньги и идут на всякие одноразовые меры, которые в переспективе только в минус.
Экспортные доходы типа нефтегазовых - офигенная схема, взять землю, на которой живут люди, добыть там нефть/газ/металлы/лес, всё продать и сказать, что люди ни при чём, это доходы государства, а людям только убитую экологию в подарок.
А если НДС не на физиков - это всё, уже не налог? Если у компаний меньше денег, это точно не способствует росту зарплат. Вдобавок есть жёсткое ограничение - коммерческая компания не может работать в минус, если рентабельность около нуля, налоги и прочие расходы напрямую ограничат рост зарплаты.
Администрацию хабра всё устраивает - они получают деньги за корпоративные аккаунты и паразитируют на контенте обычных авторов, публикующихся бесплатно. И намешивают к этому контенту корпоративных рекламных статей без возможности их скрыть.
Я полгода назад написал статью типа этой, только с более жёсткими формулировками и конкретными примерами: https://habr.com/ru/articles/878768/. Администрация хабра статью убрала в чулан (скрыли из ленты), не смотря на рейтинг +395. А когда в копроблоге выходит статья с заголовком типа "Проект Горижопа" https://habr.com/ru/companies/geltek/articles/505526/ - это для администрации хабра нормально, так можно. Так что люди голосуют ногами и разбегаются по телеграм каналам, личным страничкам и другим сайтам.
Там два в степени количества генераторов.
Можно. Комплексные числа это частный случай геометрической алгебры, когда генератор только один.
Можно и складывать, и умножать, и экспоненциировать и вообще любую функцию представить в виде ряда Тейлора и вместо числа подставить туда мультивектор.
Оно замкнутно.
Допустим, есть генераторы e1, e2, e3.
Из них можно собрать 8 комбинаций:
скаляр (без генераторов)
векторы (генераторы e1, e2, e3)
бивекторы (
е1*е2,e1*e3,e2*e3)псевдоскаляр (
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}и работать с такой формулой на порядок проще.Мне кажется, надо всё-таки ввести операцию 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.
Точно мешает.
компилятор, IDE, статический анализ кода, всякие тулы вокруг языка просто обязаны поддержать все фичи и краевые случаи языка. Это всё становится делать сложнее и результат либо дороже, либо хуже.
И если проект на несколько человек (а ещё "лучше" - легаси), то там кто-то мог наиспользовать всяких незнакомых фич и потом с этим придётся жить. Это получится как с С++ - вполне можно написать хороший код на нём "с нуля", но если придётся разбираться в чужом, то иногда без поллитра не разберёшься.
P.S. Ещё добавлю что есть Scala, где разработчики пошли по пути гибкости языка и возможности писать почти любую языковую конструкцию внутри любой другой - получилось просто и очень мощно. Например, можно объявить функцию внутри функции - это не "специальная фича языка", это просто поддержа вложенности. Можно вообще объявить класс внутри функции внутри объекта внутри класса - и это всё скомпилируется. Отдельного понятия для "статических локальных функций" нет, в нём нет смысла.
Я ошибся, надо (rand5() - 1) + 5 * (rand5() - 1).
Чтобы получилась сетка с 25 равномерными значениями.
И ещё условие отсечения можно поменять на n >= 21 для большей эффективности.
Давно уже вместо калькулятора использую консоль с питоном.
tailrec def rand7() =
val n = (rand5() - 1) * (rand5() - 1)
if (n > 13) return rand7()
return n % 7 + 1
Не только России.
Если посмотреть половозрастные пирамиды в Европе, то там много людей предпенсионного и пенсионного возраста и мало молодых. В итоге получается, что либо пенсии будут небольшими, либо налоги большие.
Вот например половозрастная пирамида для Германии:
https://ru.wikipedia.org/wiki/Население_Германии#/media/Файл:Germany_Population_Pyramid_2024.png
Хорошо влияет - 2FA SMS доверять и не надо. Телефонный номер человеку не принадлежит, его может отобрать оператор связи за неиспользование, сим карта может выйти из строя, злоумышленник может зарегистрировать новую сим-карту или вообще сделать атаку с роумингом в какой-нибудь африканской стране и смс уйдёт туда. И вообще это получается единая точка отказа - при потере номера резко станет недоступным всё, что на него завязано.
Кстати, может быть и отменят.
В экономике есть кривая сбора налогов - сначала с их ростом увеличиваются поступления, а потом при превышении какого-то порога экономика всё сильнее уходит в тень и дальнейший рост налогов только снижает поступления.
Вполне может оказаться, что кто-нибудь в будущем посчитатет и поймёт что их можно снизить и при этом собрать больше.
Сейчас резко нужны деньги и идут на всякие одноразовые меры, которые в переспективе только в минус.
https://www.consultant.ru/document/cons_doc_LAW_364178/e27ccb08fbc19720edc86945313236862ef7b407/
Экспортные доходы типа нефтегазовых - офигенная схема, взять землю, на которой живут люди, добыть там нефть/газ/металлы/лес, всё продать и сказать, что люди ни при чём, это доходы государства, а людям только убитую экологию в подарок.
А если НДС не на физиков - это всё, уже не налог? Если у компаний меньше денег, это точно не способствует росту зарплат. Вдобавок есть жёсткое ограничение - коммерческая компания не может работать в минус, если рентабельность около нуля, налоги и прочие расходы напрямую ограничат рост зарплаты.
Администрацию хабра всё устраивает - они получают деньги за корпоративные аккаунты и паразитируют на контенте обычных авторов, публикующихся бесплатно. И намешивают к этому контенту корпоративных рекламных статей без возможности их скрыть.
Я полгода назад написал статью типа этой, только с более жёсткими формулировками и конкретными примерами: https://habr.com/ru/articles/878768/. Администрация хабра статью убрала в чулан (скрыли из ленты), не смотря на рейтинг +395. А когда в копроблоге выходит статья с заголовком типа "Проект Горижопа" https://habr.com/ru/companies/geltek/articles/505526/ - это для администрации хабра нормально, так можно. Так что люди голосуют ногами и разбегаются по телеграм каналам, личным страничкам и другим сайтам.