Скачиваний:
68
Добавлен:
16.04.2013
Размер:
3.38 Mб
Скачать

Поворот изображения

Точки могут быть повернуты на угол Θ относительно начала координат, как показано на рис. 7.5 для точки Р (6, 1) и угла Θ=30°.

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

Положительными считаются углы, измеряемые против движения часовой стрелки от х к у. В случае отрицательных (по часовой стрелке) углов для модификации выражений и можно воспользоваться тождествами

cos( - Θ) = cosΘ и sin (- Θ) = - sin Θ.

Точка Р (х, у) переводится в точку Р' (х', у') поворотом на угол Θ. Поскольку поворот производится относительно начала координат, расстояния от него до Р и Р' равны. Они обозначены на рисунке через r. Из простых тригонометрических соотношений следует, что при начальном угле φ и повороте точки на угол Θ получим

x = r * cos φ, y = r * sin φ и тогда

х' = r * cos (φ + Θ) = r * cos φ* cos Θ —r* sin φ* sin Θ,

у' = r * sin (φ + Θ) =r * cos φ * sin Θ + r * sin φ cos Θ.

Теперь подставим значения x и y в два последних уравнения

х' = x * cos Θ — у * sin Θ,

у' = х * sin Θ + у * cos Θ.

Или в матричной форме

cos Θ sin Θ

[x' y'] = [x y] * - sin Θ cos Θ

или

P' = P * R,

где через R обозначена матрица поворота.

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

Преобразования переноса, масштабирования и поворота в матричной форме записываются в виде

P' = P + М,

P'=P * S,

P' = P * R.

К сожалению, перенос реализуется отдельно (с помощью сложения) от масштабирования и поворота (c помощью умножения). Хотелось бы представить их таким способом, чтобы все эти три элементарных преобразования можно было легко объединять вместе.

Ниже в этом разделе показано, как это можно сделать.

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

В однородных координатах точка Р(х, у) записывается как P(W*x, W*y, W) для любого масштабного множителя W0. При этом если для точки задано ее представление в однородных координатах Р(Х, Y, W), то можно найти ее двумерные декартовы координаты как x=X/W и y=Y/W.

Считаем, что W всегда будет равно 1, поэтому операция деления не требуется. Однородные координаты можно представить как вложение промасштабированной с коэффициентом W двумерной плоскости в плоскость z=W (здесь z = 1) в трехмерном пространстве.

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

Уравнения переноса записываются в виде матрицы преобразования однородных координат следующим образом:

[ x' y' 1] = [x y 1] *

или

P' = P * М (mx my),

где M (mx my) =

матрица переноса

Что будет, если точку Р перенести в точку Р' на расстояние (mx1 my1,), а затем в Р" на расстояние (mx2 my2)? Интуитивно ожидаемый результат в этом случае представляет собой суммарный перенос на расстояние (mx1+mx2, mу1+mу2). Чтобы доказать это, запишем данные в виде

P' = P * М(mx1 my1), (

P" = P' * М(mx2 my2).

Теперь, подставляя второе выражение в первое, получим

P'' = (P * М(mxl my1)) * М(mx2 my2)) = P * (М(mx1 my1) * М(mx2 my2)).

Матричное произведение М(mxl my1) * М(mx2 my2) есть

1 0 0 1 0 0 1 0 0

0 1 0 * 0 1 0 = 0 1 0

mx1 my1 1 mx2 my2 1 mx1 + mx2 my1 + my2 1

Действительно, результирующий перенос есть (mx1 + mx2 my1 + my2). Матричное произведение в разных случаях называют объединением, соединением, конкатенацией и композицией матриц М(mxl my1) и М(mx2 my2).

То-есть, переносы аддитивны.

Уравнения масштабирования в однородных координатах записываются в следующем виде:

Sx 0 0

[x' y' 1] = [x y 1] * 0 Sy 0

0 0 1

или P' = P * S (Sx Sy )

Пример. Покажем, что двойное масштабирование мультипликативно.

Если задано P' = P * S(Sx1 Sy1) и P" = P' * S(Sx2 Sy2). Тогда

P" = P * [S(Sx1 Sy1) * S(Sx2 Sy2)].

Матричное произведение выражения, стоящего в скобках, равно

Sx1 0 0 Sx2 0 0 Sx1 * Sx2 0 1

0 Sy1 0 * 0 Sy2 0 = 0 Sy1 * Sy2 0

0 0 1 0 0 1 0 0 1

Уравнения поворота аддитивны и их можно представить в виде:

cosΘ sinΘ 0

[x' y' 1] = [x y 1] * -sinΘ cos Θ 0

0 0 1

или P' = P * R (Θ )