В двух предыдущих статьях мы научились рассматривать нормали в трёхмерном пространстве двумя разными способами: как бивекторы или как дуальные векторы (ковекторы). Обе интерпретации корректны, но они выражаются в различных единицах и по разному реагируют на преобразования. В третьей и окончательной части мы отойдём от нормалей и рассмотрим некоторые другие интересные векторные величины. Мы видели как бивекторы и тривекторы из внешней алгебры выражают ориентированные площади и объёмы соответственно. Так же мы изучили ковекторы, которые действуют как ориентированные плотности линий в единицах обратных к длине. Теперь мы объединим эти геометрические концепции и посмотрим в какой степени они могут быть полезны. (В степени? Прямо как степень масштабного коэффициента? Ладно, забейте.) Мы собираемся отправиться с места в карьер, потому если вам нужно освежить знания о внешней алгебре или сопряжённых пространствах, то пробегитесь по двум предыдущим статьям. Внешняя алгебра позволяет брать внешнее произведение векторов, которое производит алгебраические сущности более высокого порядка, такие как бивекторы и тривекторы. По аналогии с обычными векторами можно сделать то же самое с дуальными векторами, получая дуальные бивекторы и дуальные тривекторы. Дуальный бивектор получается из внешнего произведения двух дуальных векторов: а дуальный тривектор - из трёх: Это работает так же как внешнее произведение обычных векторов. В частности, выполняется тот же закон антикоммутативности. Каков же геометрический смысл дуальных k-векторов? Вспомним что дуальный вектор определяется как линейная форма, то есть функция из некоторого векторного пространства  в . Внешнее произведение дуальных векторов оказывается изоморфным к дуальному внешнему произведению векторов. Для конечномерного  можно записать: где  - операция конструирования набора k-векторов над данным векторным пространством. В итоге, дуальные k-векторы можно понимать как линейные формы над k-векторами: дуальный бивектор является линейной функцией из пространства бивекторов в действительные числа, а дуальный тривектор - линейная функция из тривекторов в скаляры. Давайте детальнее разберёмся как это работает. В прошлой статье мы видели что ковектор можно визуализировать как поле параллельных равноотстоящих плоскостей, представляющих линии уровней линейной формы: Расстояние между плоскостями на этой картинке отражает интервалы единичной величины на выходе линейной формы. Но всё же не забывайте, что фактически этих плоскостей бесконечно много и они непрерывно заполняют пространство по одной на каждое выходное значение линейной формы. Когда вы вычисляете значение линейной формы, то есть свёртываете ковектор с вектором, результат показывает сколько плоскостей этот вектор пересекает от своего начала до конца (в непрерывном смысле слова "сколько"). Это зависит как от длины, так и от направления вектора: например, параллельный плоскостям вектор всегда вернёт единицу, вне зависимости от его длины. Дуальный бивектор можно представить похожим образом, но вместо плоскостей будет поле параллельных прямых, равномерно распределённых на перпендикулярной к ним плоскости. На этой диаграмме видно, что внешнее произведение двух ковекторов даёт дуальный бивектор, состоящий из всех прямых на пересечении плоскостей, соответствующих двум дуальным векторам. Что произойдёт если свернуть этот дуальный бивектор с обычным бивектором? Как и раньше, получится скаляр, который теперь показывает сколько прямых пересекает бивектор! Если визуализировать бивектор как параллелограмм, или как круг, или как любую другую фигуру, у неё будет какая-то площадь. Потому она пересечёт какое-то количество непрерывного набора прямых. Это количество не будет зависеть от фигуры бивектора: напомним, что у бивектора нет определённой формы - у него есть только площадь (абсолютная величина) и ориентация. Бивектор, чья плоскость параллельна прямым, превратится в ноль вне зависимости от своей площади. Так как ковекторы несут единицы обратной длины, а дуальный бивектор есть произведение дуальных векторов, дуальный бивектор соответствует единицам обратной площади. Он представляет ориентированную плотность по площади, например плотность вероятности на поверхности! Результат свёртки дуального бивектора с бивектором сообщает насколько много вероятности (или ещё чего нибудь) покрывает площадь этого бивектора. Как подсказывает анализ размерности, дуальные бивекторы масштабируются как . То есть если вы увеличите масштаб объекта в  раз, то плотность вероятности на его поверхности уменьшится в  раз, потому что та же самая суммарная вероятность теперь распределена по большей в  раз площади. Что насчёт правила преобразования для дуальных бивекторов? В первой статье мы поняли что преобразование бивектора - это присоединённая матрица к (обозначим её ). Во второй мы увидели что дуальные векторы преобразуются с помощью обратной транспонированной матрицы . Отсюда следует что дуальные бивекторы преобразуются как , или, что то же самое, . Поразительно, но для матриц 3х3 эти формулы усыхают до То есть дуальные бивекторы преобразуются просто с помощью матрицы делённой на свой определитель. Продолжим следовать шаблону: если ковекторы в 3D выглядят как стопка параллельных плоскостей, а дуальные бивекторы выглядят как набор параллельных прямых, тогда дуальный тривектор выглядит как облако параллельных точек. Ну, опустим слово "параллельных", оно здесь ничего не значит. Это просто точки, равномерно расположенные в узлах пространственной решётки. Как и ранее, внешнее произведение трёх ковекторов, или ковектора и дуального бивектора сооружает непрерывное облако точек из всех пересечений внешних сомножителей. Эта величина масштабируется как  и выражает объёмную плотность. Если применить дуальный тривектор к тривектору, результат покажет какая величина облака точек заключена в объёме тривектора. Правило преобразования в этом случае простое: дуальный тривектор в трёхмерном пространстве всего лишь умножается на . С вводом дуальных би- и тривекторов наш "зоопарк масштабов" наконец заполнен! У нас есть завершённая экосистема векторных величин со степенями масштабов от -3 до +3, каждая со своими единицами и соответствующей формулой преобразования. Далее мы кратко затронем ещё несколько аспектов расширенной внешней алгебры с сопряжёнными пространствами. Как мы видели во второй части, векторное пространство и его сопряжённое пространство имеют "естественную свёртку" между векторами и ковекторами, похожую на скалярное произведение. Эта свёртка обобщается и на k-векторы с их дуальными  векторами. Фактически, можно и дальше обобщать естественную свёртку так чтобы она работала с k-векторами и дуальными векторами разных степеней. Например, можно определить способ "свернуть" ковектор с бивектором таким образом: Геометрически получившийся вектор лежит в плоскости  и направлен параллельно плоскостям уровней . В некотором смысле "съедает" размерность  которая лежит вдоль направления плотности  и оставляет остальные размерности в виде вектора. Такое расширение операции свёртки называется внутренним произведением, хотя разные источники часто определяют его различными способами. Не будем сильно углубляться в эту тему. Основная идея в том что можно скомбинировать k-вектор с дуальным -вектором для любых k и , и получить (k-)-вектор, у которого отрицательные степени соответствуют дуальным векторам. Вдобавок к двойственности векторных пространств о которой мы говорили, внешняя алгебра содержит ещё одно понятие двойственности: двойственность Ходжа, выраженную оператором под названием звезда Ходжа: . (Обратите внимание, что символ отличается от обычной звёздочки , которой обозначалось сопряжённое пространство). Понятие сопряжённости векторных пространств соотносит k-векторы с дуальными векторами той же степени: векторы с ковекторами, бивекторы с дуальными бивекторами и т.д. Двойственность Ходжа работает иначе: она соотносит сущности с косущностями дополнительной (комплиментарной) степени. Применение звезды Ходжа к k-вектору создаст элемент степени , где - размерность пространства. В трёхмерном случае она заменяет векторы (степень 1) на бивекторы (степень 2), а скаляры (степень 0) на тривекторы (степень 3). Я определю звезду Ходжа немного отличным от стандартного способом. Фактически есть две операции звезды Ходжа: одна переводит k-векторы в дуальные ()-векторы, а другая действует в обратном направлении. Я обозначу их как и соответственно. Они взаимно обратны (как минимум в трёхмерном случае). Определяются они так: Здесь угловыми скобками справа обозначено внутреннее произведение. То есть чтобы применить звезду Ходжа к k-вектору нужно взять его внутреннее произведение со стандартным единичным дуальным тривектором (или единичным дуальным -вектором в -мерном случае). В результате получается дуальный -вектор, который геометрически представляет плотность по всем размерностям, не включенным в исходный k-вектор. Чтобы сделать антизвезду Ходжа над дуальным k-вектором, нужно взять его внутреннее произведение с , что даст -вектор, содержащий все размерности, не представленные исходным дуальным k-вектором, то есть все размерности, перпендикулярные к его плоскостям уровней. Эти две операции почти определены на не связанных между собой областях, и потому могли бы быть объединены в одну "умную" звезду, которая автоматически определяет что делать в зависимости от типа аргумента... кроме случая k=0. Если применить эту звезду к скаляру, то во что он должен превратиться: в тривектор или в дуальный тривектор? Именно поэтому нужны две различные операции. В трёхмерном случае интересен случай векторов, заменяемых на бивекторы: Вектор  под действием прямой звезды переходит в дуальный бивектор, чьи линии идут параллельно . Бивектор  под действием прямой звезды переходит в дуальный вектор, плоскости уровня которого параллельны . Дуальный вектор  под действием обратной звезды переходит в бивектор, параллельный плоскостям уровней . Дуальный бивектор  под действием обратной звезды переходит в вектор, параллельный линиям . Несмотря на некоторую запутанность формального определения, видно что геометрический результат операций Ходжа довольно прост. Всё строится на переходах от геометрии k-вектора и соответствующих поверхностей уровня к геометрии дуального -вектора и наоборот. Звёзды Ходжа очень полезны при работе со значениями из внешней и двойственной к ней внешний алгебры. В большинстве трактовок внешней или геометрической алгебры сопряжённые пространства почти не упоминаются. Более общепринятое определение звезды Ходжа напрямую взаимно отображает k-векторы и -векторы без всяких ковекторов. Как это работает? Оказывается, если на нашем векторном пространстве определено некоторое скалярное произведение, то с его помощью можно переходить туда и обратно между векторами и ковекторами, или между k-векторами и их дуальными векторами. До сих пор мы не вводили никакого способа отобразить отдельный вектор из основного в сопряжённое пространство, и наоборот. Хотя они и являются векторными пространствами одинаковой размерности, между ними не существует естественного изоморфизма. Тем не менее, наличие скалярного произведения обособляет замечательный изоморфизм основного пространства с сопряжённым. Им будет изоморфизм, который отображает вектор  в  ковектор , определяя внутреннее произведение как обычное скалярное произведение. Более формально, для всех векторов  определим . Это определение может быть расширено на внутренние произведения и изоморфизмы для всех k-векторов (подробности в Википедии). Заменим, что это отображении не сохраняется при масштабировании и преобразованиях вообще, потому что  преобразуется оператором , а  оператором . Имея такое соответствие можно во многом игнорировать существование сопряжённых пространств их элементов. Можно воображать что они не отличаются от основных элементов. В ортонормированном базисе даже координаты вектора и его ковектора будут одинаковыми. Вот пример "забывания" о дуальных сущностях: звёзды Ходжа можно определить с помощью скалярного произведения чтобы незаметно перевести в сопряжённое пространство их аргументы или значения. Тогда две определённых выше звезды Ходжа схлопнутся в одну операцию, отображающую между  и . Пользы довольно много. Мы начали только с векторов и нормалей - двух векторообразных вещей с различными правилами, и это различие сбивало с толку. Но теперь у нас есть четыре сущности: векторы, ковекторы, бивекторы и дуальные бивекторы. Помимо этого возникли ещё и три скаляроподобных объекта: истинные безразмерные скаляры, тривекторы и двойственные тривекторы. Очевидно, много людей спокойно живут даже не подозревая обо всех этих различиях! Даже статьи о внешней или геометрической алгебре не всегда так глубоко погружаются в сопряжённые пространства. Вместо этого они трактуют k-векторы и дуальные к ним как единую сущность, неявно используя определённый выше изоморфизм. Их различное поведение при трансформациях становится всего лишь занятным фактом, частью бессистемного орнамента. Взамен такой подход требует чтобы некоторые элементы алгебры имели скалярное произведение или метрику, и это правильно работает только в ортонормированном базисе. Напротив, если "приправить" теорию сопряжённостью, то можно вывести формулы которые правильно работают в любом базисе. В качестве небольшого примера рассмотрим конкретную задачу из графики. Допустим у нас есть меш из треугольников, и мы хотим выбрать на нём случайную (в смысле равномерного распределения по поверхности) точку. Чтобы это сделать, нужно выбрать случайный треугольник с вероятностью, пропорциональной площади. Обычно для этого предрассчитывают площади всех треугольников и строят таблицу с префиксными суммами. Далее для выбора треугольника достаточно взять равномерно распределённую случайную величину и найти ближайшее к ней значение в таблице бинарным поиском. Внесём в задачу немного разнообразия. Что если меш преобразован, возможно неоднородным масштабированием или скосом? В общем случае преобразование изменяет площади треугольников в зависимости от ориентации. Равномерное распределение в пространстве модели (локальном пространстве меша) больше не будет равномерным в мировом пространстве. Можно было бы преобразовать весь меш в мировое пространство и сделать выборку уже в нём, но это слишком дорого. Бивекторы приходят на помощь! Вместо предрассчёта скалярной площади каждого треугольника можно рассчитать бивектор, представляющий его площадь и ориентацию. Для треугольника с вершинами , ,  это будет . Далее прерьразуем все бивекторы в мировое пространство с помощью подходящего правила, и они будут представлять площади преобразованных треугольников. Наконец рассчитаем их абсолютные значения и построим таблицу префиксных сумм. Задачу можно решить и в обратную сторону. Допустим, у нас есть неоднородная вероятностная мера, определённая на треугольной сетке. Например, это может быть источник света с текстурой, определяющей силу излучения, и нам нужно выбрать точку с учётом силы излучения. Или может нужно выбрать с учётом телесного угла в заданном направлении, или ещё с какой нибудь мерой визуальной важности. Эти плотности вероятностей можно представить как дуальные бивекторы, и преобразовывать их в мировое пространство и обратно в локальное. Даже под воздействием неортогональных преобразований меша распределение будет сохраняться. Ещё несколько примеров где возникают дуальные k-векторы: Производная (градиент) скалярного поля (например SDF) является ковектором по своей природе. Пространственные частоты (волновые векторы) в анализе Фурье - ковекторы. Переносимая лучом энергетическая яркость (radiance) является плотностью, удельной по площади проекции. Потому её хотя бы частично можно выразить дуальным бивектором. Как и многие другие математические концепции, эти вещи полезны больше для усовершенствования ваших мысленных моделей геометрии, улучшения мыслительного процесса и для вывода формул которые можно использовать в коде более традиционным способом. Я не утверждаю, что нам всем нужно срочно бежать и переписывать классы математических библиотек на k-векторы и дуальные к ним. Хотя если честно, в математических библиотеках творится тот ещё бардак. Перед завершением дам вам ещё немного пищи для размышлений. Выше мы увидели целый "зоопарк масштабирований" математических конструкций с различным поведением, различной геометрической и физической интерпретацией. Разные области естественных наук и математики по разному упорядочивают этот зоопарк, по разному осмысляют его обитателей и отношения между ними. В компьютерных науках мы склонны понимать векторы, бивекторы и ковекторы как различные типы. У каждого из них может быть внутренняя структура, состоящая из более простых величин (действительных чисел), и набор разрешённых операций, который определяет что с ними можно делать и как они друг с другом взаимодействуют. Тем временем, физики обычно исповедуют более прямолинейный подход. Геометрические элементы они понимают как матрицы действительных (иногда комплексных) чисел в связке с правилами преобразований, которые говорят что произойдёт с данной матрицей при замене координат. Алгебраические свойства (например, антикоммутативность) получаются через конструирование матриц таким образом, чтобы матричное умножение реализовывало нужную алгебру. Например, бивектор можно представить антисимметричной матрицей. Внешнее произведение двух векторов  и  даёт бивектор, соответствующий вычислению матрицы У этого выражения есть то же свойство антикоммутативности, что и у внешнего произведения. Умножение этой матрицы на (дуальный) вектор  представляет внутреннее произведение бивектора на . Дуальный бивектор по структуре будет точно таким же, но у него будет другой закон преобразования ("ковариантный" а не "контравариантный"). Наконец, математики формализуют этот зоопарк относя различные геометрические значения к различным пространствам и/или алгебрам. Оба этих термина в конечном итоге означают "множество" (в теоретико-множественном смысле), снабжённое какой-то дополнительной структурой: алгебраическими операциями, топологией, нормой или метрикой, и т.п. Конкретная структура зависит от того что именно вы делаете. Таких структур существует огромное количество, и они используются в самых разных контекстах. Так какая структура стоит за зоопарком масштабирований? У нас есть структура векторного пространства и есть внешняя алгебра. Но ни то ни другое не отражает всего разнообразия масштабирований и преобразований дульных элементов: сопряжённые пространства изоморфны своим исходным пространствам (в конечномерном случае), а то и полностью идентичны им. У меня ещё нет проработанного ответа, но я подозреваю что он лежит где-то в теории представлений групп Ли. Мне кажется что разные типы масштабирований могут быть закодированы как векторные пространства, на которые подействовали разными представлениям группы , то есть группы Ли всех линейных отображений на . В общем, не будем углубляться в эту тему. Для более подробного изучения есть пара хороших ссылок: раз, два. Ещё есть книга о роли теории представлений в практической физике. Я надеюсь это было увлекательное и полезное путешествие через глубинные слои нашей любимой евклидовой геометрии. Мы начали с простого вопроса: почему векторы нормалей нужно преобразовывать обратной транспонированной матрицей? И увидели что существует намного более богатая структура чем видно на поверхности. "Зоопарк масштабирований" k-векторов и дуальных к ним получился полным и симметричным. Хоть я и не применяю эти вещи на практике каждый день, их изучение помогло мне понять вещи, которые раньше я осознавал весьма смутно и расплывчато. Осознание существования этих тонких различий того стоило. В жизни я всегда руководствуюсь тем что всё вокруг более сложно чем кажется на первый взгляд, и нигде это правило не проявляется так ярко как в математике!