Я предполагаю, что вы говорите о 2D здесь. Матрица аффинного преобразования содержит 9 значений:
| a1 a2 a3 |
A = | a4 a5 a6 |
| a7 a8 a9 |
Есть 3 входные вершины x1
, x2
и x3
, которые при преобразовании должны стать y1
, y2
, y3
. Однако, поскольку мы работаем в однородных координатах, применение A
к x1
не обязательно дает y1
- оно дает кратное y1
. Итак, у нас также есть неизвестные множители k1
, k2
и k3
, с уравнениями:
A*x1 = k1*y1
A*x2 = k2*y2
A*x3 = k3*y3
Каждый из них является вектором, поэтому у нас действительно есть 9 уравнений на 12 неизвестных, поэтому решение будет ограничено. Если нам потребуются a7=0
, a8=0
и a9=1
, то решение будет уникальным (этот выбор является естественным, поскольку это означает, что если точка ввода (x
, y
, 1), выходная точка всегда будет иметь однородную координату 1, поэтому полученное преобразование будет просто преобразованием 2x2 плюс перевод).
Следовательно, это сводит уравнения к:
a1*x11 + a2*x12 + a3 = k1*y11
a4*x11 + a5*x12 + a6 = k1*y12
1 = k1
a1*x21 + a2*x22 + a3 = k2*y21
a4*x21 + a5*x22 + a6 = k2*y22
1 = k2
a1*x31 + a2*x32 + a3 = k3*y31
a4*x31 + a5*x32 + a6 = k3*y32
1 = k3
Итак, k1
= k2
= k3
= 1. Подключив их и преобразовав в матричную форму, вы получите:
| x11 x12 1 0 0 0 | | a1 | | y11 |
| x21 x22 1 0 0 0 | | a2 | | y21 |
| x31 x32 1 0 0 0 | * | a3 | = | y31 |
| 0 0 0 x11 x12 1 | | a4 | | y12 |
| 0 0 0 x21 x22 1 | | a5 | | y22 |
| 0 0 0 x31 x32 1 | | a6 | | y32 |
Решение этой системы уравнений 6x6 дает вам матрицу аффинного преобразования A
. У него будет уникальное решение, если и только если 3 точки вашего исходного треугольника не коллинеарны.