
Геометрические преобразования
При работе с графическими системами и формировании изображения постоянно возникает необходимость его изменить. В распоряжении пользователя находится большой арсенал команд редактирования: перемещение, поворот, осевая симметрия, подобие, копирование, изменение размеров объекта и многие другие.
Двумерные преобразования
В основе изменения графической информации лежат три основных преобразования: перенос, масштабирование и поворот. На их основе строятся все известные изменения объектов в графических системах.
Перенос
Точки на плоскости можно перенести в новые позиции путем добавления к координатам этих точек констант переноса. Для каждой точки Р(х, у), которая перемещается в новую точку Р'(х',у') сдвигаясь на Dx единиц по оси X и на Dy по оси Y. можно написать
Но объект представляет собой множество точек. Его можно переносить, применяя уравнение переноса к каждой точке. Однако каждый отрезок состоит из бесконечного числа точек, и этот процесс длился бы бесконечно долго. Удобнее перенести все точки, принадлежащие отрезку, путем перемещения одних лишь крайних его точек, а затем вычертить новый отрезок между ними (рис. 2.1).
Масштабирование
Точки можно масштабировать (растянуть) в Sx раз по оси X и в Sy раз по оси Y. Получим новые точки с помощью умножения:
x’ = x*Sx,y’ = y*Sy
Определить S в виде матрицы:
,
м
ожно
записать в матричной форме:
[x’y’] = [xy] *
или
P’ = P*S.
М
асштабирование
производится относительно начала
координат (рис. 2.2).
В
результате домик стал меньше и ближе к
началу координат. Если бы масштабные
коэффициенты были больше единицы, домик
увеличился бы и отдалился от начала
координат. Пропорции домика тоже
изменились. Было применено неоднородное
масштабирование, при котором Sx
≠ Sy.
Однородное масштабирование (Sx
= Sy
) не влияет на пропорции.
Поворот
Т
очки
могут быть повернуты на угол α относительно
начала координат (рис. 2.3).
Тогда координаты точки Р':
x’ = xcosΘ – ysinΘ,
y’ = xsinΘ + ycosΘ
В матричной форме:
или P’ = P*R , где R — матрица поворота.
П
оложительное
значение соответствует повороту против
часовой стрелки (рис. 2.4), отрицательное
— по часовой стрелке.
Рис. 2.4. Поворот объекта
О
Преобразования переноса, масштабирования и поворота в матричной форме имеют вид:
P’ = P + T
P’ = P*S
P’ = P*R
Перенос реализуется с помощью операции сложения, а масштабирование и поворот — с помощью умножения. Это вызывает неудобство при осуществлении нескольких преобразований над объектом. Каждую точку объекта придется последовательно подвергать каждому преобразованию. Если объект имеет N точек и необходимо провести, например, три последовательных преобразования, то понадобится 3 * N действий. Удобно было бы все преобразования представить в единой форме. Тогда можно было бы один раз найти результирующую матрицу преобразования, а затем лишь умножить ее на все точки. В таком случае количество действий стало бы N + 2, где 2 — это две операции по умножению трех матриц. Если выразить точки в однородных координатах, то все три преобразования можно реализовать с помощью операции умножения. И хотя умножение выполняется аппаратно медленнее сложения, и размерность матриц увеличивается на единицу, при большом количестве точек объекта наблюдается ощутимое преимущество.
В однородных координатах точка Р(х, у) записывается как Р( W*х, W*у,W), где W— масштабный множитель, не равный нулю.
При этом если точка задана в однородных координатах Р(Х, Y,W), то можно найти ее декартовы координаты:
X
=
,
Y
=
.
Если же W = 1, то операция деления не нужна:
P(x,y,1) , P’(x’,y’,1)
Основные преобразования в однородных координатах выразятся следующим образом.
Перенос
У
равнение
переноса запишется в виде матрицы
преобразования:
1 0 0
[x’ y’ 1] = [x y 1] * 0 1 0
Dx Dy 1
Или P’ = P * T (Dx , Dy), где
П
еремножив,
получим:
[x’ y’ 1] = [x + Dx , y + Dy , 1].
То есть перенос – функция аддитивная.
М асштабирование
/
[x’ y’ 1] = [x y 1] *
Уравнение масштабирования в матричной форме имеет вид:
О
пределяя
имеем:
P’ =P*S(Sx,Sy)
Перемножив, получим:
[x’ y’ 1] = [x*Sxy*Sy1].
Докажем
что масштабирование – функция
мультипликативная, то есть если точку
P(x,y)
промасштабировать в точку P’(x’,y’)
c
S=
(Sx1,Sy1),
а потом – в точку P’’(x’’,y’’)
c
S=(Sx2,Sy2),
то результат будет иметь вид:
S
=(Sx1*Sx2*Sy1*Sy2).
С
помощью масштабирования легко реализуется
осевая симметрия. Для этого используется
отрицательные значения коэффициентов
масштабирования в матрице.
Поворот