2D аффинные преобразования Однородные координаты

advertisement
Математические основы
компьютерной графики
1. Геометрическое моделирование в
компьютерной графике.
2. Координатный метод и системы
координат.
3. Двумерные аффинные
преобразования.
Аффинные преобразования
Все изменения изображений можно
выполнить с помощью трех базовых
операций:

поворот;

масштабирование;

отражение;

перенос (смещение).
2D аффинные преобразования
Переход от одной декартовой системы
координат на плоскости к другой описывается
следующими соотношениями:
 x'  x  y   ,

 y '  x  y   ,
где ,,, - произвольные числа, но
(*)
 
0
 
2D аффинные преобразования
 x'  x  y   ,

 y '  x  y   ,
Изменяется точка, и
сохраняется координатная
система – формула задает
отображение, переводящее
Y
произвольную точку М(x,y)
в точку M(x’,y’), координаты
которой определены в той
M
O
M’
X
же координатной системе.
2D аффинные преобразования

Y
I. Поворот (вокруг начальной точки на
угол ) описывается формулами:
xM '  xM cos( )  yM sin(  ),
yM '  xM ( sin(  ))  yM cos( ).
M’
 cos  sin  
 sin  cos  



M
X
( xM , yM )  (3, 0)
0


cos

2
( xM ' , yM ' )  (3, 0)  

 sin
2

 sin

2   (3, 0)   0 1  (0, 3)
  1 0
 


cos 
2 
2D аффинные преобразования
 II. Масштабирование вдоль координатных осей:
x '   x,
y '  y.
  0,   0.
 0 
0  


( xM1 , yM 1 )  (1, 2);
( xM 2 , y M 2 )  (3, 4)
 0 
 0 
 (3   , 4   )
( xM ' , yM ' )  (1, 2)  
 ( , 2   ); ( xM 2' , yM 2' )  (3, 4)  


1
1
0  
0  
2D аффинные преобразования
 III. Отражение относительно оси абсцисс
задается при помощи формул:
x '  x,
y '   y.
1 0 
0 1


( xM , yM )  (3, 2)
1 0 
( xM ' , yM ' )  (3, 2)  
 (3,  2)

0  1
2D аффинные преобразования
 IV. Перенос обеспечивают
соотношения:
x'  x   ,
y'  y  .
M’
Y
M
X
O
2D аффинные преобразования
Для применения перечисленных выше
преобразований в задачах КГ применяется
их матричная запись:
cos 
 sin 

 sin  
,

cos  
 0 
 0  ,


1 0 
0  1


Однородные координаты
Однородными координатами точки
M(x,y) называется тройка
одновременно не равных нулю чисел
x1 , x 2 , x3 , если:
x1
x2
x , y .
x3
x3
Однородные координаты
Точке М(x, y) ставится в
соответствие точка М’(x, y, 1) в
Z
пространстве.
M’(x,y,1)
1
соединяющей начало координат,
Y
M(x, y)
0
X
Произвольная точка на прямой,
точку О(0,0,0), с точкой М’(x, y, 1),
может быть задана тройкой (hx, hy,
h). Исключая точку О из
рассмотрения, будем считать, что
h0.
Однородные координаты
Считая h=1 выражение
переписать в виде:
  0
( x' , y ' ,1)  ( x, y,1)     0
   1
 x' 



или  y '   
 1   
(*)
можно
 0  x 



 0   y 
 1  1 
Матрица 2D вращения (поворота)
 cos 

R   sin 
 0
sin 
0

cos  0
0
1
Матрица 2D масштабирования
 0 0


D   0  0
 0 0 1
Матрица 2D отражения
1 0 0


M   0  1 0
0 0 1
Матрица 2D переноса (сдвига)
1

T    0

0

1 0
 1
0
ПРИМЕР 1
 Построить матрицу растяжения с
коэффициентом растяжения  вдоль оси
абсцисс и δ вдоль оси ординат и с центром
в точке А(а,b).
Шаг 1
 Перенос на вектор –А(–а,–b) для
смещения центра растяжения с началом
координат:
0 0
1


T А    0 1 0
 a  b 1
Шаг 2
 Растяжение вдоль координатных осей с
коэффициентами  и . Матрица
преобразования имеет вид:
 0 0


D   0  0
 0 0 1
Шаг 3
 Перенос на вектор А(а,b) для возвращения
центра растяжения в прежнее положение:
 1 0 0


TА   0 1 0
a b 1
Ответ:
 Перемножив матрицы в том же порядке ,
получим вид нашего преобразования:
T A  D TA 
0
0
 
( x' , y' ,1)  ( x, y,1) 
0

0
a  (1   ) b  (1   ) 1
Пример 2
Построить двумерное изображение фигуры.
Выполнить сдвиг относительно оси x и оси y.
( x0 , y0 ,1)  (3, 2, 1);
( x1 , y1 ,1)  (1, 6, 1);
( x2 , y2 ,1)  (8, 2, 1);
( x3 , y3 ,1)  (8, 6, 1);
3
1
А  
8

8
2 1

6 1
2 1

6 1
Отрисовка 2D фигуры
function SistCoord(a:vertex):vertex;
begin
PatBlt(Form1.Canvas.Handle,0,0,Form1.ClientWidth,Form1.ClientHeight,WHITE
NESS);
Form1.Canvas.MoveTo(0,round(Form1.ClientHeight/2));
Form1.Canvas.LineTo(round(Form1.ClientWidth),round(Form1.ClientHeight/2));
Form1.Canvas.MoveTo(round(Form1.ClientWidth/2),0);
Form1.Canvas.LineTo(round(Form1.ClientWidth/2),round(Form1.ClientHeight));
Form1.Canvas.MoveTo(a[0,0],a[0,1]);
Form1.Canvas.LineTo(a[1,0],a[1,1]);
Form1.Canvas.LineTo(a[2,0],a[2,1]);
Form1.Canvas.LineTo(a[3,0],a[3,1]);
Form1.Canvas.LineTo(a[0,0],a[0,1]);
end;
Отрисовка 2D фигуры
Сдвиг фигуры
С  А TA 
3
1
С   
8

8
2 1
1 0 0 

6 1 

 0 1 0  ?
2 1
 2 1 1
6 1
Сдвиг фигуры
5
3
С   
10

10
3 1 

7 1
3 1

7 1
Умножение матриц
function mult(a:vertex;b:change):vertex;
var i,j,k:integer;
Begin
for i:=0 to 3 do
begin
for j:=0 to 2 do
for k:=0 to 2 do
c[i,j]:=c[i,j]+a[i,k]*b[k,j];
end;
end;
Сдвиг фигуры
procedure TForm1.sdvig1Click(Sender: TObject);
begin
mult(a,sd);
SistCoord(c);
end;
Сдвиг фигуры
Спасибо за внимание!
Download