Главная
Исходники
Вычисления
Работа со строками
Маленькие хитрости
Рекурсия
Работа с графикой
Работа с массивами
Работа с файлами
Работа с записями
Динамические структуры данных
Методы сортировок
Фракталы
Литература
Теория вероятностей
Видео уроки
Ссылки
ОднаКнопка

Web www.pascal.hop.ru

Матричное преобразование двумерного пространства

При построении графических объектов на экране, всегда возникает задача с их перемещением или трансформацией. Как правило, это остаётся только на уровне вопроса. Попробуем продвинуться немного дальше.

Любой обьект на плоскости можно представить в виде множества точек на плоскости, каждая из которых будет являться одной из вершин объекта. Пока под объектом будем понимать любой n-угольник произвольной формы.

Любое естественное преобразование плоскости можно представить в виде произведения трёх преобразований: переноса, растяжения и вращения относительно начала координат. Соответственно эти преобразования можно записать в виде произведения матрицы на вектор-столбец, или вектор-строку. Так как сейчас рассматриваем преобразования плоскости или двумерного пространства, то такие действия можно описать матрицей 3х3, для преобразований в пространстве используется матрица 4х4.

Лирическое отступление. Что такое матрица и с чем её едят.

Матрица 3х3 ничто иное как таблица чисел, состоящая из 3х стобцов и 3х строк, а вектор-столбец это столбец из 3х чисел.

Числа в скобках означают позицию, в которой находится этот элемент, номер строки и столбца соответственно. В общем виде, любой элемент матрицы A можно записать как A(I,J), где I - строка, J - столбец.

С матрицами можно выполнять математические операции, рассмотрим некоторые из них.

  • Сложение
    C(I,J)=A(I,J)+B(I,J)
  • Умножение матрицы A на некоторое число K (скаляр)
    B(I,J)=K*A(I,J)
  • Умножение матрицы A на вектор-столбец E, в результате получится вектор-столбец D
    E(I)=A(I,1)*D(1)+A(I,2)*D(2)+A(I,3)*D(3)=SUM(K)(A(I,K)*D(K))
  • Умножение матрицы A на матрицу B
    C(I,J)=A(I,1)*B(1,I)+A(I,2)*B(2,I)+A(I,3)*B(3,I)=SUM(K)(A(I,K)*B(K,J))

Перенос.

Точка с координатами (X,Y) переводится в точку с новыми координатами (X',Y') с помощью вектора (TX,TY):

  • X' = 1 * X + 0 * Y + TX
  • Y' = 0 * X + 1 * Y + TY

матрица этого преобразования:

Растяжение

При таком преобразовании координата X умножается на SX, а Y - координата точки на SY:

  • X' = SX * X + 0 * Y + 0
  • Y' = 0 * X + SY * Y + 0

этому преобразованию соответсвует матрица:

Обычно SX и SY положительны, но если одно из них отрицательно, то это приводит дополнительно к отражению, напирмер, если SX=-1 и SY=1, то точка отражается относительно оси Y.

Вращение относительно начала координат

Если необходимо повернуть плоскость на некоторый угол TETA против часовой стрелки (как это принято в математике) относительно начала координат, то уравнения, определяющие такие преобразования, имеют вид:

  • X' = COS(TETA) * X - SIN(TETA) * Y + 0
  • Y' = SIN(TETA) * X + COS(TETA) * Y + 0

и матрица:

Обратное преобразование

Для каждого преобразования существует обратное преобразование, которое восстановит первоначальные позиции точек. Исходя из теории матрице A соответсвует матрица A^(-1). Предыдущие преобразования настолько элементарны, что нет необходимости обращать матрицу, достаточно выполнить аналогичные преобразования с инверсным параметром.

  1. перенос точки (TX,TY) и противоположные ему (-TX,-TY);
  2. растяжение плоскости (SX,SY) и уменьшение размера (1/SX,1/SY), обратите внимание на то что на ноль делить нельзя, хотя растяжение по одной из координат на 0 - ничего хорошего не даёт. Наверняка такого не случится иначе плоскость просто превратится в прямую;
  3. поворот на угол TETA и противоположный ему -TETA;

Вращение плоской (2D) фигуры.

Вращение объемной (3D) фигуры.

Лень учить? Смотри pascal на видео

Пахтусов Сергей, 02.03.2006