Аффинное преобразование - PullRequest
1 голос
/ 18 ноября 2009

Я пытаюсь решить проблему ниже. Я не очень разбираюсь в аффинных преобразованиях . Может ли кто-нибудь помочь мне ответить на этот вопрос:

Найти матрицу 3x3, представляющую 2D аффинное преобразование однородных координат (т. Е. Каждая точка [x, y] представляется в виде вектора столбца [x, y, 1]), который преобразует квадрат [0,0], [ 1,0], [1,1], [0,1] в параллелограмм [0,1], [1,1], [2,2], [1,2].

Ответы [ 4 ]

1 голос
/ 28 октября 2014

Аффинное преобразование - это преобразование вида x ⟼ Ax + b, где x и b - векторы, а A - квадратная матрица. Геометрически аффинные преобразования отображают параллелограммы в параллелограммы и сохраняют относительные расстояния вдоль линий.

Чтобы решить такую ​​проблему, сначала отметим, что для начала координат мы имеем 0 ⟼ A0 + b = b. Поскольку задача говорит нам, что [0,0] ⟼ [0,1], мы знаем, что b = [0,1].

Далее мы напомним из линейной алгебры, что умножение матрицы на стандартные базисные векторы [0,1] и [1,0] просто извлекает первый и второй столбцы матрицы соответственно:

[a b] [1] = [a],  [a b] [0] = [b].
[c d] [0]   [c]   [c d] [1]   [d]

Нам даны, что [1,0] ⟼ [1,1] и [0,1] ⟼ [1,2]. Отсюда получаем

[1,1] = A[1,0] + b = [a,c] + [0,1] ⟹ [a,c] = [1,0],
[1,2] = A[0,1] + b = [b,d] + [0,1] ⟹ [b,d] = [1,1].

Это дает нам наше аффинное преобразование

Ax + b = [1 1] x + [0].
         [0 1]     [1]

Однородные координаты - это уловка, которая позволяет нам записывать аффинные преобразования в виде матриц, просто с одной дополнительной координатой, которая всегда установлена ​​в 1. Матричная формула равна

[A b] [x] = [Ax+b].
[0 1] [1]   [   1]

Здесь A на самом деле матрица 2 × 2, тогда как b и x 2-вектора, а 0 в нижнем левом углу действительно [0 0]. Итак, в целом мы имеем дело с матрицей 3 × 3 и 3 векторами.

Итак, наше решение

[1 1 0]
[0 1 1],
[0 0 1]

и для хорошей проверки мы проверяем, что он работает правильно для конечной точки:

[1 1 0] [1]   [2]
[0 1 1] [1] = [2].
[0 0 1] [1]   [1]
1 голос
/ 18 ноября 2009

Вещи, которые я заметил об этом вопросе
1) Вам необходимо понять однородные координаты
2) Вам нужно знать разницу между строкой и основным столбцом - читайте здесь
3) Вам необходимо знать основные аффинные преобразования - вращать, масштабировать / сдвигать и переводить и как представлять их в матрице - читать эту страницу

Интересно, я думаю, что для ответа нужен только перевод и сдвиг (без вращения).
Глядя на исходные и конечные точки, кажется, что все точки назначения переведены +1 в y и сдвинуты в 1 в X (чтобы дать параллелограмм, вероятно, лучше всего нарисовать его, чтобы понять, что я имею в виду)

Итак, начните с 3 * 3 единичной матрицы , которая равна

1 0 0
0 1 0
0 0 1

Сдвиг будет
1 1 0
0 1 0
0 0 1

перевод будет
1 0 0
0 1 1
0 0 1

Так что все это вместе должно быть

1 1 0
0 1 1
0 0 1

Я обычно не использую основной столбец, поэтому, вероятно, стоит проверить дважды!

Надеюсь, это поможет

0 голосов
/ 29 декабря 2009

Я просто хотел указать, что четыре точки ограничивают двухмерное аффинное преобразование. В комментарии Джонатана Леффлера вы можете увидеть это из того факта, что вам нужно будет инвертировать неквадратную матрицу. Итак, либо выберите три из точек, либо установите систему наименьших квадратов. Чрезмерно ограниченное решение методом наименьших квадратов может быть решено с помощью следующих матриц

A = [ a  b  c ]    B = [ 0  1  1  0 ]   C = [ 0  1  2  1 ]
    [ d  e  f ]        [ 0  0  1  1 ]       [ 1  1  2  2 ]
    [ g  h  1 ]        [ 1  1  1  1 ]       [ 1  1  1  1 ]

так что решение с использованием нормальных уравнений дает

A B = C
(A B)^T = B^T A^T = C^T
B B^T A^T = B C^T
A^T = (B B^T)^-1 B C^T

удаление этого транспонирования дает

A =  ((B B^T)^-1 B C^T)^T
0 голосов
/ 18 ноября 2009

Вы, конечно, прочитали страницу Википедии на эту тему.

Однажды или около того назад я прочитал Фоли и Ван Дама в одной из предшествующих версий (это было бы в 1983 или 1984 году), и в ней рассказывалось о методах манипулирования 2D и 3D координатами с помощью расширенные матрицы и векторы, как описано в вопросе. Однако с тех пор прошло достаточно времени, и я забыл все детали (и у меня больше нет книги - слишком много переездов). Я также помню, что была книга Ньюмана и Спроула.

A = [ a  b  c ]    B = [ 0  1  1  0 ]   C = [ 0  1  2  1 ]
    [ d  e  f ]        [ 0  0  1  1 ]       [ 1  1  2  2 ]
    [ g  h  1 ]        [ 1  1  1  1 ]       [ 1  1  1  1 ]

Столбцы B представляют углы квадрата; столбцы C представляют углы параллелограмма; и матричное уравнение A x B = C должно быть решено. IIRC, матрица A имеет 1 в правом нижнем углу; возможно, что значения c, f, g и h также имеют предварительно заданные значения (они, вероятно, будут равны нулю). Ненулевые значения применяют линейное (аффинное) преобразование, масштабирование, сдвиг и поворот входной формы.

Вам нужно искать подобную информацию в учебнике. Или на вики-странице - я не очень внимательно смотрел на нее (информация выше работает из древней памяти).

...