Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[40]

Зеркальное отображение:

ц-\/ \1относительно оси Y=X

\ проходящей под углом "A"

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

► X

Деформация сдвига : в направлении X - a в направлении Y - b

cos(2*A) sin(2*A) 0 sin(2*A) - cos(2*a) 0 001

0 0 - 1 0 0 0 1

1 tg(a) 0 tg(b) 1 0

0 0 1

Составные преобразования обычно представляют в виде комбинаций типовых преобразований. Например, поворот относительно произвольной точки ( Xc, Yc) можно представить как комбинацию трех преобразований:

-параллельный перенос, переводящий центр поворота в начало координат,

-поворот относительно начала координат,

-параллельный перенос, противоположный первоначальному.

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

ац a12 a13 а21 a22 a23

a31 a32 a33

b11 b12 b13

b21 b22 b23 b31 b32 b33

c11 c12 c13 c21 c22 c23 c31 c32 c33

где ci j = ai i* bi j + ai 2* b2 j + ai 3* bj 3

i= 1, 2, 3; j= 1, 2, 3.

то есть элемент матрицы "C", расположенный в I-строке и J-столбце, равен сумме произведений элементов I -ой строки матрицы "A" на соответствующие элементы J-го столбца матрицы B.

В приведенной ниже программе плоская фигура задается в виде линий, последовательно соединяющих координаты массива точек (xa, ya) на чертеже ( x, y - в системе координат экрана ). Эти координаты подвергаются аффинным преобразованиям, коэффициенты преобразования хранятся в двумерном массиве r. Начальному положению фигуры соответствует единичная матрица R (единицы на главной диагонали, остальные члены - нули). При очередном преобразовании коэффициенты матрицы R пересчитываются путем умножения на нее матрицы этого преобразования (А), получаемая матрица (В) снова записыва-


ется в R. Новые координаты x, y высчитываются в процедуре NEWXY, которая вызывается непосредственно при выводе фигуры на экран процедурой PICTURE.

uses Graph, Crt;{-------Аффинные преобразования плоских фигур--------}

var Gd,Gm,n,i,j,k,l,m,xc,yc,xc1,yc1: integer;{-- описание --}

{ глобальных переменных} xa, ya: array[1..50] of real;{ исходные координаты фигуры }

x, y : array[1..50] of integer;{ новые координаты фигуры }

a, b, r: array[1..3, 1..3] of real; { массивы коэффициентов матриц 3*3 }

PROCEDURE I R;{-------- присвоение матрице R значения единичной --------- }

for i:=1 to 3 do begin{ 1 0 0 }

for j:=1 to 3 do r[i, j]:=0;{ 0 1 0 }

r[i, i]:=1; end;{ 0 0 1 }

PROCEDURE MULT;{----------умножение матриц А и R: R = B = A*R ------------}

var z: real; begin

begin z:=0;

z:=z+a[i,k]*r[k,j]

b[i,j]:=z end;

r[i,j]:=b[i,j] end;

PROCEDURE MOVE(dx,dy:real); {-расчет матриц А и R для переноса фигуры ---} begin{ ---на dx, dy--- }

for i:=1 to 3 do begin{ 1 0 dx }

for j:=1 to 3 do a[i,j]:=0;{ 0 1 dy }

a[i,i]:=1 end;{ 0 0 1 }

a[1,3]:=dx; a[2,3]:=dy;

MULT; end;

PROCEDURE SCALE(sx,sy:real); {-расчет матриц А и R для масштабирования ---- }

begin{--фигуры: по оси Х - умножение на sx, по оси Y - на sy --}

for i:=1 to 3 do

for j:=1 to 3 do a[i,j]

a[1,1] a[2,2]

MULT; end;

=0;{ sx 0 0 }

=sx;{ 0 sy 0 }

=sy; a[3, 3]:=1; { 0 0 1 }

PROCEDURE ROTATE(alfa: real); {- расчет матриц А и R для поворота фигуры--} var c, s: real;{-на угол alfa(рад)-}

begin{ cos(alfa) -sin(alfa) 0 }

for i:=1 to 3 do{ sin(alfa) cos(alfa) 0 }

for j:=1 to 3 do a[i,j]:=0;{ 001 }


c:=cos(alfa); a[1,1] s:=sin(alfa); a[1,2] MULT; end;

= c; a[2,2]:=c; =-s; a[2,1]:=s;

PROCEDURE MIRROR(alfa: real); {- расчет матриц А и R для зеркального -} var c, s: real;{-отражения объекта на угол аа(рад)--}

begin{ cos(2*alfa) sin(2*alfa) 0 }

for i:=1 to 3 do{ sin(2*alfa) -cos(2*alfa) 0 }

for j:=1 to 3 do a[i,j]:=0; { 001 }

a[3,3]:=1;

c:=cos(2*alfa); a[1,1]:=c; a[2,2]:=-c; s:=sin(2*alfa); a[1,2]:=s; a[2,1]:=s; MULT; end;

PROCEDURE AXES(alfa,beta:real); {расчет матриц А и R сдвига осей координат }

{- ось x смещается на угол alfa, ось y - на угол beta --}

for i:=1 to 3 do begin{ 1 tg(beta) 0 }

for j:=1 to 3 do a[i,j]:=0;{ tg(alfa) 1 0 }

a[i,i]:=1 end;{ 0 0 1 }

a[1,2]:=sin(beta)/cos(beta); a[2,1]:=sin(alfa)/cos(alfa); MULT;

PROCEDURE NEW XY;{---- расчет новых координат фигуры по исходным ------ }

begin{-----с использованием матрицы преобразования R------}

for i:=1 to n do begin x[i]:=round( xa[i]*r[1, 1]+ ya[i]*r[1, 2]+ r[1, 3] ); y[i]:=round( xa[i]*r[2, 1]+ ya[i]*r[2, 2]+ r[2, 3] ) end; end;

PROCEDURE PICTURE;{--- рисование фигуры по координатам X, Y --- }

beginmoveto(x[n], y[n]);

for i:=1 to n do lineto(x[i], y[i]); end;

PROCEDURE ROT XY(xc,yc,beta:real); {- поворот фигуры вокруг точки ( хс, ус)-- } begin{-- на угол beta -- }

MOVE(-xc, -yc); { Смещение центра поворота в центр начала координат }

ROTATE(beta); { поворот относительно начала координат }

MOVE(xc, yc); { обратное смещение фигуры } end;

{------примеры аффинных преобразований исходной фигуры ------ }

Var alfa: real;

BEGINn:=4;{ число вершин фигуры }

m:=12;{ число зеркальных отображений фигуры }

xc:=5;yc:=5;{"центр" фигуры}

xa[1]:=5; ya[1]:=5;{ координаты вершин фигуры на чертеже }



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53]