Аффинное преобразование обычно задается матрицей
Впрочем, можно обойтись и без

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

Итак, мы видим, что действие любого аффинного преобразования
Выделенный синим цветом вектор
Если кого‑то удивляет такая запись, то вспомните о векторном произведении
С нижней матрицей всё предельно просто — она получается из верхней вычёркиванием первой строки и первого столбца. Недостаток (1) в том, что приходится считать детерминанты, однако если эту рутинную задачу переложить на компьютер, то окажется, что человеку останется лишь правильно заполнить матрицы числами из его задачи. При этом с помощью одной формулы можно решить довольно много распространенных на практике задач:
- нахождение аффинного преобразования по точкам;
- расчёт барицентрических координат;
- полилинейную интерполяцию;
- задачи на линейные преобразования (без трансляции):
Аффинное преобразование по трем точкам на плоскости
Под действием неизвестного аффинного преобразования три точки на плоскости перешли в другие три точки. Найдем это аффинное преобразование.
Для определенности, пусть наши входные точки 
а результатом действия преобразования стали точки

На самом деле, решать эту задачу можно по‑разному: с помощью системы линейных уравнений, барицентрических координат… но мы пойдем своим путем. Думаю, по использованным обозначениям Вы догадываетесь к чему я клоню: берём уравнение (1) для размерности

а дальше остается лишь посчитать детерминанты

Намётанный глаз легко обнаружит здесь поворот на
Когда формула применима?
Входные и выходные векторы могут иметь разную размерность — формула применима для аффинных преобразований, действующих на пространствах любой размерности. Впрочем, входных точек должно быть достаточно и они не должны «слипаться»: если аффинное преобразование действует из
Зачем восстанавливать аффинные преобразования программисту?
Часто нужно найти преобразование между двумя картинками (для расчёта положения камеры, например). Если у нас найдётся несколько надёжных особых точек (фич) на этих изображениях, ну или просто не хочется начинать сразу с ранзаков и борьбы с аутлаерами, то вполне можно использовать эту формулу.
Еще один пример — текстурирование. Вырезать треугольник из текстуры и натянуть на треугольник где‑нибудь на плоскости или в пространстве — типичная задача на применение аффинного преобразования к точкам из пространства текстуры, переводящее их в пространство, где «живут модели». И довольно часто нам легко указать каким точкам на текстуре соответствуют вершины треугольника модели, но вот установить куда переходят неугловые точки может потребовать некоторых размышлений. С этой же формулой достаточно просто вставить числа в правильные ячейки и будет вот такая красота.

Из того, с чем приходилось лично сталкиваться: нейросеть выдаёт координаты углов маркера и мы хотим «дополнить реальность» виртуальным объектом, который располагается на маркере.
Очевидно, при перемещении маркера объект должен повторять все его движения. И тут формула (1) как нельзя кстати — она нам поможет передвинуть объект вслед за маркером.
Или вот еще пример: нужно запрограммировать вращение различных объектов на сцене с помощью инструмента «гизмо». Для этого мы должны уметь вращать выбранную модель вокруг трех осей параллельных осям координат и проходящих через центр объекта. На картинке показан случай вращения модели вокруг оси параллельной

В конечном итоге всё сводится к двумерной задаче о вращении вокруг произвольной точки. Давайте даже решим её для какого‑то простого случая, скажем, поворота на

Барицентрические координаты
Разложим верхний детерминант (1) по первой строке согласно правилу Лапласа. Ясно, что в результате мы получим некоторую взвешенную сумму векторов

Давайте опробуем этот «рецепт» на практике. Задача: найти барицентрические координаты точки по отношению к заданному треугольнику. Пусть для определённости это будет точка

Дело за малым — взять (1) для

Вот и решение: барицентрическими координатами
Заметьте, формула (1) обладает приятной двойственностью: если разложить детерминант по первому столбцу — получим стандартную запись для аффинной функции, а если по первой строке — аффинную комбинацию выходных векторов.
Полилинейная интерполяция
Итак, мы обнаружили, что аффинное преобразование взвешивает выходные векторы с коэффициентами, равными барицентрическим координатам аргумента. Естественно воспользоваться этим свойством для полилинейной интерполяции.
Интерполяция цвета
Для примера, давайте просчитаем стандартный GL‑ный «привет мир» — раскрашенный треугольник. Конечно, OpenGL прекрасно умеет интерполировать цвета и тоже делает это с помощью барицентрических координат, но сегодня мы это сделаем сами.
Задача: в вершинах треугольника заданы цвета, произвести интерполяцию цвета внутри треугольника. Для определённости, пусть вершины нашего треугольника имеют координаты

Припишем им цвета: жёлтый, циан и маджента

Тройки чисел — это RGB‑компоненты цвета. Возьмём (1) и правильно расставим входные данные

Здесь компоненты

Можно сказать, мы только что произвели аффинное преобразование двумерного пространства картинки в трехмерное пространство цветов (RGB).
Интерполяция нормалей (шейдинг Фонга)
Мы можем вкладывать самый разный смысл в векторы, которые мы интерполируем, в том числе это могут быть векторы нормалей. Более того, именно так и делается шейдинг Фонга (Phong shading), только после интерполяции векторы нужно нормировать. Для чего нужна такая интерполяция хорошо иллюстрирует следующее изображение (взятое из Википедии commons.wikimedia.org/w/index.php?curid=1556366).

Приводить расчёты, я думаю, уже не стоит — все детали рассмотрены в [2], а вот картинку с результатом я покажу.

Векторы на ней не единичные и для использования в шейдинге Фонга должны быть сначала отнормированы, к тому же, для наглядности, они направлены в очень разные стороны, что редко бывает на практике.
Найти плоскость
по трем точкам
Рассмотрим еще один необычный пример применения аффинного преобразования.
Даны три точки

Найдём уравнение проходящей через них плоскости в виде

и которое «подхватит» вместе с точками и всю плоскость
Как обычно, мы лишь должны распределить числа по элементам матриц

Перепишем последнее выражение в привычном виде

и нарисуем что вышло.

Линейные преобразования
Несмотря на всю практическую важность аффинных преобразований, чаще приходится иметь дело с линейными. Конечно, линейные преобразования — частный случай аффинных, оставляющие на месте точку

Как видим, из формулы пропала последняя строчка с единицами и один столбец. Этот результат вполне согласуется с нашими представлениями, что для задания линейного преобразования достаточно указать его действие на
Линейное преобразование по трем точкам
Давайте решим задачу, чтобы увидеть как всё работает. Задача: известно, что под действием некоторого линейного преобразования

Найдём это линейное преобразование.
Берём упрощённую формулу и ставим правильные числа на правильные места:

Готово!
Нахождение обратного преобразования
Напомню, что матрица линейного преобразования

содержит в своих столбцах образы единичных векторов:

Итак, действуя матрицей на орты, мы получаем её столбцы. А что можно сказать об обратном преобразовании (допустим, оно существует)? Оно все делает «наоборот»:

Постойте‑ка, ведь мы только что нашли образы трёх точек под действием линейного преобразования — достаточно, чтоб восстановить само преобразование!

где
Не будем себя ограничивать трехмерным пространством и перепишем предыдущую формулу в более общем виде

Как видим, надо приписать к матрице слева колонку с компонентами вектора‑аргумента, сверху — строчку с координатными векторами, а дальше дело только за умением брать детерминанты.
Задача на обратное преобразование
Давайте опробуем приведённый метод на практике. Задача: обратить матрицу

Воспользуемся (2) для

Сразу видно, что

Правило Крамера в одну формулу
Ещё со школы мы сталкиваемся с уравнениями вида

Если матрица

Хм… не в предыдущем ли разделе я видел такое же выражение, только вместо

Это не что иное, как правило Крамера. В этом легко убедиться, разложив детерминант по первой строке: вычисление
Присмотревшись к полученному уравнению, можно заметить его схожесть с уравнением для нахождения барицентрических координат: решение системы линейных уравнений— это нахождение барицентрических координат точки
Решение системы линейных уравнений
Решим систему линейных уравнений

В матричной форме она выглядит так

Используем полученную формулу

откуда ответ
Преобразование координат вектора при смене базиса
Предположим, что мы выбрали новый базис (перешли к другой системе координат). Известно, что новые координаты векторов выражаются через старые линейно. Поэтому неудивительно, что мы можем использовать наш инструментарий для смены базиса. Как это сделать, я покажу на примере.
Итак, пускай мы перешли от стандартного базиса

В старом базисе задан вектор

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

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

Решение задачи привычным образом требует обращения матрицы (которое, впрочем, также в основном состоит из вычисления детерминантов) и умножения

Мы лишь упаковали эти шаги в одну формулу.
Почему формула работает для обратных задач?
Эффективность формулы в решении обратных задач объясняется тем, что выполняется следующее равенство (доказательство есть в [1])

Таким образом, формула прячет в себе обратную матрицу и умножение на еще одну матрицу в придачу. Это выражение и есть стандартное решение задачи нахождения линейного преобразования по точкам. Заметьте, что делая вторую матрицу в произведении единичной, мы получим просто обратную матрицу. С ее помощью решается система линейных уравнений и задачи, которые к ней сводятся: нахождение барицентрических координат, интерполяция полиномами Лагранжа, и т.д. Однако, представление в виде произведения двух матриц, не даёт нам получить те самые «два взгляда», связанные с разложением по первой строке и по первому столбцу.
Интерполяция Лагранжа и ее свойства
Напомню, что интерполяция Лагранжа — это нахождение полинома наименьшей степени проходящего через точки
Как связаны полиномы и линейные преобразования?
Дело в том, что полином

можно рассматривать как линейное преобразование, которое отображает вектор

а это мы делать умеем. Подставим правильные буквы в правильные ячейки и получим формулу

Доказательство, что это будет именно полином Лагранжа (а не чей‑то другой), можно посмотреть в [1]. Кстати, выражение в знаменателе — это определитель Вандермонда. Зная это и разложив детерминант в числителе по первой строке, придем к более привычной формуле для полинома Лагранжа.
Задача на полином Лагранжа
Сложно ли этим пользоваться? Давайте попробуем силы на задаче: найти полином Лагранжа, проходящий через точки
Подставим эти точки в формулу

На графике всё будет выглядеть так.

Свойства полинома Лагранжа
Разложив верхний детерминант по первой строке и первому столбцу, мы взглянем на полином Лагранжа с двух разных сторон. В первом случае получим классическую формулу из Википедии, а во втором — запись полинома в виде суммы одночленов

А ещё мы теперь можем сравнительно просто доказывать довольно замысловатые утверждения. Например, в [2] в одну строчку доказывается, что сумма базисных полиномов Лагранжа равна единице и что полином Лагранжа, интерполирующий
Заключение
Спасибо всем, кто дочитал до конца. В этой статье мы решали стандартные задачи с помощью одной нестандартной формулы. Мне она понравилась тем, что, во‑первых, показывает, что аффинные(линейные) преобразования, барицентрические координаты, интерполяция и даже полиномы Лагранжа тесно связаны. Ведь когда решения задач записываются единообразно, мысль об их сродстве возникает сама собой. Во‑вторых, большую часть времени мы просто расставляли входные данные в правильные ячейки без дополнительных преобразований.
Задачи, которые мы рассматривали, можно решить и вполне привычными методами. Однако, для задач небольшой размерности или учебных задач формула может быть полезной. Кроме того, мне она кажется красивой.
Список литературы
[1] Beginner's guide to mapping simplexes affinely
[2] Workbook on mapping simplexes affinely

