Компьютерная графика | |||||||
теория, алгоритмы, примеры на С++ и OpenGL | |||||||
2D теория | 3D теория | OpenGL | Обратная связь / Авторам | ||||
Мы vkontakte.ru ДрузьяСловарь синонимов русского языка |
Аффинное преобразование и его матричное представление
Тема этого выпуска задание аффинного преобразования в матричной форме. Эта
тема, по сути, является обобщением всего, что было сказано ранее.
Преобразование называется взаимно однозначным, если
Прим. Более подробно про аффинные преобразования
можно посмотреть на ru.wikibooks.org Однородные координаты Если рассмотреть параллельный перенос, то оказывается, что для его задания
матрицы 2x2 уже недостаточно. Но его можно задать с помощью матрицы размера
3x3. Появляется вопрос, откуда взять третью координату у двумерной точки? Определение. Однородные координаты — координаты, обладающие тем свойством,
что определяемый ими объект не меняется при умножении всех координат на одно и
то же число.
Однородными координатами вектора (х, у) является тройка чисел (x', y', h), где х = х' / h, у = y'/h, а h — некоторое вещественное число (случай,
когда h = 0 является особым). Прим. Данные координаты не позволяют однозначно
задать точку плоскости. Например, (1, 1, 1) и (2, 2, 2) задают одну и ту же точку (1, 1). Предлагается взять набор (x, y, 1), который будет описывать все точки
плоскости. Матрица преобразования для однородных координат имеет размер 3х3. Рассмотрим
некоторые преобразования в однородных координатах. Сжатие/растяжение Это преобразование умножает
соответствующие координаты точек на коэффициенты масштабирования по осям: (x, y) -> (ax * x, ay * y). Матрица преобразования запишется следующим образом: [ ax 0 0 ] [ 0 ay 0 ] [ 0 0
1 ] Где ax – растяжение по оси x, ay – растяжение по оси y. Поворот Матрица поворота 2x2 была подробно
разобрана ранее. Теперь она дополняется строкой и столбцом: [ cos(phi) sin(phi)
0 ] [ -sin(phi) cos(phi) 0 ] [ 0 0 1 ] Прим.
При угле phi = п эта матрица задает центральную симметрию относительно начала координат,
которая является частным случаем поворота. Можно заметить, что такую симметрию
можно задать с помощью преобразования сжатия/растяжения (допуская отрицательные
коэффициенты масштабирования). Параллельный перенос Исходный вектор (x, y) переходит в (x + tx, y + ty).
Матрица преобразования запишется следующим образом: [ 1 0 0 ] [ 0 1 0 ] [ tx ty 1 ] Отражение Как говорилось в примечании к преобразованию сжатия/растяжения, отражения получаются следующим образом: [ -1 0 0 ] [ 0 1 0 ] [ 0 0 1 ] [ 1 0 0 ] [ 0 -1 0 ] [ 0 0 1 ] Общий вид аффинного преобразования Матрица 3x3, последний столбец которой равен ( 0 0 1 )T, задает аффинное преобразование плоскости: [ * * 0 ] [ * * 0 ] [ * * 1 ] По одному из свойств, аффинное
преобразование можно записать в виде: f(x) = x * R + t, где R – обратимая матрица 2x2, а t – произвольный вектор. В однородных координатах это запишется следующим образом: [ R1,1 R1,2 0 ] [ R2,1 R2,2 0 ] [ tx ty 1 ] Если умножить вектор-строку на эту матрицу
получаем результат преобразования: [ x
y 1 ] * [ R1,1 R1,2 0 ] [ R2,1 R2,2 0 ] [ tx ty 1 ] = [ x’
y’ 1 ] + [ tx ty 1 ] При этом [ x’ y’ ]
= R * [ x y ] Прим. Любопытный читатель уже задал себе
вопрос: в чем смысл определителя матрицы R? При аффинном преобразовании площади
всех фигур изменяются в |R|.
(Можно строго доказать это с точки зрения математики, но здесь этот факт
приводится без доказательства.) Т.о. аффинное преобразование
представляется в виде композиции некоторого преобразования, задаваемого
матрицей R, и параллельного
переноса. Разберем более подробно природу этой матрицы и возможности, которые
она нам дает. Матрица R определяет новый базис плоскости. Т.е. вектор (1, 0) переходит в (R1,1, R1,2), вектор (0, 1) переходит в (R2,1, R2,2). Новый базис это строки матрицы R. Пример.
[ -1 0 ]
В приведенном примере реализованы эти функциональные блоки, с подробными комментариями. Скачать исходный текст демонстрационной программы |