68910

Аффинные преобразования координат при моделировании динамики объектов

Лекция

Информатика, кибернетика и программирование

Начальному положению фигуры соответствует единичная матрица R единицы на главной диагонали остальные члены нули. Новые координаты x y высчитываются в процедуре NEW_XY которая вызывается непосредственно при выводе фигуры на экран процедурой PICT.=

Русский

2014-09-27

197 KB

0 чел.

ЛЕКЦИЯ 7

Аффинные преобразования координат при моделировании динамики объектов.

Преобразования  координат  графических  объектов используются  весьма  широко.  Основные случаи:

-  объект описан не в декартовой координатной системе,

-  изображение типовых  или повторяющихся  деталей объекта,

-  построение проекций  трехмерных объектов,

-  направленная деформация  при синтезе новых форм,

-  мультипликация.

Различают двумерные ( 2D )  и  трехмерные ( 3D)

преобразования координат. Видов преобразований много,  рассмотрим только так называемые  аффинные преобразования,  когда  в

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

Общий вид формул  двумерных  аффинных преобразований:

x* = a11  x + a12  y + a13

y* = a21  x + a22  y + a23

Здесь  x, y -  координаты  исходного,  а x*, y*  - преобразованного объекта.

Коэффициенты преобразований a I J    сохраняют

в виде матрицы, расширенной до квадратной, при этом a11    a12    a13

очень просто вычисляются коэффициенты какого-либо a21    a22    a23

сложного преобразования, если известны коэффициенты 0 0 1

преобразований, его составляющих. Для этого просто перемножают соответствующие матрицы коэффициентов.

Примеры  типовых  преобразований и соответствующие им матрицы: ( Ф - исходная фигура,  Ф* -  преобразованная )

Y

dx Ф* Параллельный 1 0 dx

dy перенос 0 1 dy

Ф 0 0 1

X


Y

Ф 0 0 1

X

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

 

-1 0 0

Ф* Ф относительно оси Y 0 1 0

0 0 1

X

1 0 0

Ф* относительно оси  X 0 -1 0

0 0 1

Y Ф* Y=Х

 

относительно оси  Y=Х 0 1 0

Ф 1 0 0

0 0 1

X

Ф* относительно начала -1 0 0

координат 0  -1 0

0 0 1

Y Ф*

a

 

Поворот относительно cos a -sin a 0

начала  координат sin a cos a 0

Ф 0 0 1

X

Прочие преобразования обычно представляют в виде

комбинаций перечисленных выше простейших преобразований.

Например, поворот относительно произвольной точки можно представить как комбинацию трех преобразований:

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

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

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

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

a11

a12

a13

b11

b12

b13

c11

c12

c13

a21

a22

a23

*

b21

b22

b23

=

c21

c22

c23

a31

a32

a33

b31

b32

b33

c31

c32

c33

где  c I J = a I 1 * b 1 J + a I 2 * b 2 J + a I 3 * b J 3 ,

то есть для расчета элемента матрицы,  расположенного в  I-строке  и

J-столбце,  вычисляется сумма произведений элементов этой строки в матрице A на соответствующие элементы этого столбца в  матрице

B.

При нахождении матрицы коэффициентов  сложного преобразования координат важен порядок перемножения:  матрицы перемножают последовательно от последней к первой.  Для приведенного выше примера первому преобразованию соответствует матрица  В,  второму -  А.

В приведенной ниже программе  линейчатая фигура задается в виде массивов координат ее вершин  xa, ya  на чертеже  ( x, y  -  в

системе координат экрана ). Эти координаты подвергаются аффинным преобразованиям, коэффициенты преобразования хранятся в

двумерном массиве R.  Начальному положению фигуры соответствует единичная матрица  R  (единицы на главной диагонали, остальные

члены - нули).

При очередном преобразовании коэффициенты  матрицы  R пересчитываются путем умножения  на нее матрицы этого преобразования (А),  получаемая матрица (В)  снова записывается  в

R.  Новые координаты  x, y  высчитываются в процедуре NEW_XY, которая вызывается непосредственно при выводе фигуры на экран процедурой  PICT.  Причем если установить для рисования цвет фона,

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

Все простые преобразования  координат (перенос, вращение, масштабирование, сдвиг) , а также некоторые типовые преобразования как комбинации простых  оформлены в виде процедур.


uses Graph, Crt;

var Gd, Gm, n, i, j, k, xc, yc:  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 значения единичной }

var  i, j:  integer ; begin

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; end;

{

0

0

1

}

{---------------------------------------------------------------------------------------

---}

PROCEDURE MULT;

{ умножение матриц  А и  R,  результат (матр. В)  записывается в  R }

var z: real; i, j, k:  integer;

begin

for i:=1 to 3 do

for j:=1 to 3 do begin  z:=0;

for k:=1 to 3 do z:=z+a[ i, k] *  r[ k, j];

b[i, j]:=z  end;

for i:=1 to 3 do

for j:=1 to 3 do  r[ i, j]:=b[ i, j]  end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE NEW_XY;

{ вычисление новых координат фигуры по базовым  коорд. XA, YA

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

var i: integer ; begin

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  TRAN( dx, dy: real);

{ расчет матриц  А и  R для переноса объекта на  dx, dy }

var i, j: integer ; begin

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 }

MULT;  end;

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


PROCEDURE  SCALE( sx, sy: real );

{ расчет матриц  А и  R для масштабирования объекта:

по оси Х - умножение на sx, по оси Y - на sy }

var  i, j: integer; begin { sx  0 0 }

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

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

a[1, 1]:=sx; a[2, 2]:=sy; a[3, 3]:=1;

MULT;  end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE  ROTATE( alfa: real );

{ расчет матриц  А и  R  для поворота объекта на угол alfa(рад): }

var c, s: real; i, j: integer;

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; { 0 0 1 }

a[3, 3]:= 1;

c:=cos( alfa);

a[1, 1]:= c;

a[2, 2]:=c;

s:=sin( alfa);

a[1, 2]:=-s;

a[2, 1]:=s;

MULT;  end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE  LOOK( alfa, dx, dy, sx, sy:  real);

{ перевод объекта из локальной системы координат (на чертеже)

в систему координат экрана:  -  поворот объекта на угол  alfa(рад),

-  перенос на  dx,dy,

-  масштабирование  sx,sy,

- пересчет базовых координат  xa,ya. }

var xx, yy: real; i: integer;

begin

I_R; ROTATE( alfa); TRAN( dx, dy); SCALE( sx, sy);

for i:=1 to n do begin

xx:=xa[ i] *  r[1, 1]+ya[ i] *  r[1, 2] + r[1, 3];

yy:=xa[ i] *  r[2, 1]+ya[ i] *  r[2, 2] + r[2, 3];

xa[ i]:=round( xx);

ya[ i]:=round( yy); end; I_R; end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE  PICT( color: word );

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

var i:  integer; begin  setcolor( color);

if(color>0)  then  NEW_XY; { Вычисление новых координат фигуры: пересчет не производится при рисовании черным цветом }

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

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

PROCEDURE RS( beta, kx, ky: real );

{ поворот фигуры относительно ее центра  xm, ym  на угол  beta,  а

также ее масштабирование  (kx - коэффициент для оси  x, ky - для y)

без смещения центра фигуры }

var xm, ym: real; i: integer;

begin  xm:=0; ym:=0;

for i:=1 to n do begin xm:=xm+x[ i]; ym:=ym+y[ i];  end;

xm:=xm /n; ym:=ym /n; { координаты центра фигуры }

TRAN(-xm, -ym); { Перенос центра фигуры в начало координат: }

ROTATE( beta);

{

центр поворота и центр масштабирования

}

SCALE(kx, ky);

{

совпадают с центром фигуры.  }

TRAN(xm, ym); { Обратный перенос фигуры } end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE ROT_XY( xc, yc, beta:  real);

{ поворот фигуры  относительно точки  хс, ус  на угол beta }

begin

TRAN(-xc, -yc); { Смещение фигуры так, чтобы ее новое положение относительно начала  координат было таким же,  как старое

положение относительно  xc, yc. }

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

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

{---------------------------------------------------------------------------------------

---}

PROCEDURE AXES( alfa, beta:  real);

{ расчет матриц  А и  R cмещения осей координат (деформация сдвига) ось x смещается на угол  alfa,  ось  y - на угол  beta }

var i, j:  integer; begin

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; end;

{---------------------------------------------------------------------------------------

---}

PROCEDURE MIRROR( delta: real; index: byte);

{ расчет матриц  А и R  зеркального отображения фигуры относительно оси, параллельной одной из осей координат:

при index=1: относительно оси, -1 0 2*delta

параллельной оси Y 0 1 0

и проходящей через точку  (delta, 0). 0 0 1

при index=2: относительно оси, 1 0 0

параллельной оси X 0 -1 2*delta

и проходящей через точку  (0, delta). 0 0 1 }

var i, j: integer; begin

for i:=1 to 3 do begin

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

a[i, i]:=1  end;

a[ index, index]:=-1; a[ index, 3]:=2*delta; MULT; end;

{---------------------------------------------------------------------------------------

----

Определяем  плоскую  фигуру : }

BEGIN

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

xa[1]:= 5;

ya[1]:= 5;

{ координаты вершин фигуры на чертеже }

xa[2]:=70;

ya[2]:=20;

xa[3]:= 5;

ya[3]:=35;

xa[4]:=20; ya[4]:=20;

      Gd:= Detect; InitGraph(Gd, Gm, ' ' );

LOOK( 0, 0, -70,  1, -1);  { переход к координатам экрана }

PICT( 9); { показ начального положения фигуры

--------- Примеры аффинных преобразований плоской фигуры ----------

}

SCALE( 4, 2); { увеличение по оси  х  в 4 раза, по оси  у в 2 раза }

TRAN( 10,60); { смещение по оси х  на 10 пикселей, по оси у - на 60}

PICT( 14);

readln;

{--------------------Вращение с увеличением и смещением ------------------

-}

for  i:=1 to 100 do begin

PICT( 13); { вывод фигуры }

RS( 0.04, 1.01, 1.01); { поворот на 0.04 рад. и увеличение  на 1%}

TRAN( 4, 0); delay(20); { смещение фигуры }

PICT( 0); { стирание фигуры - черным  по старым координатам }

end;

PICT( 13);

readln;

ClearDevice;

I_R;

{---------------- Вращение вокруг смещающегося центра -------------------

-}

for i:=1 to 60 do begin

PICT(14);

xc:=xc+3; yc:=yc+2; putpixel(xc, yc, 12); { смещение центра xc,yc }

TRAN(3, 2); { перенос фигуры соответственно смещению центра }

ROT_XY(xc, yc, -0.3); { поворот на 0.3 рад относительно  xc,yc  }

delay(20);

PICT( 0); end;

readln;

ClearDevice;

I_R;

SCALE( 2, 4);

PICT(14);

{-------------- Смещения осей координат  (деформация сдвига) ----------

}

AXES( 1, 0); { сдвиг оси х } PICT( 10); readln;

AXES(-1, 0); { возврат } PICT( 11);

AXES( 0, 1); { сдвиг оси у } PICT( 12); readln;

AXES( 0, -1); { возврат } PICT( 13);

for i:=1 to 100 do begin

AXES( 0.01,  0.01); { постепенный сдвиг обеих осей }

PICT( 0);

PICT(14);

delay(10); end;

readln;

ClearDevice;

I_R;

SCALE( 4, 4);

PICT(14);

{------------------- Зеркальные отображения фигуры -------------------------

}

MIRROR(250, 1); PICT(10); { отображение относительно  вертикали  }

MIRROR(150, 2); PICT(11); { отображение относительно горизонтали}

readln;

CloseGraph;

END.


Ф*

Масштабирование

M

0

0

M = x*/x = y*/y

0

M

0


 

А также другие работы, которые могут Вас заинтересовать

76686. ИСКОВАЯ ДАВНОСТЬ 257.87 KB
  В юриспруденции учение об исковой давности является одним из фундаментальных, и привлекает к своему исследованию многих ученых цивилистов. Не смотря на то, что дефиниция исковой давности относится к числу теоретических разногласий, институт исковой давности не умаляет своего научного и практического значения.
76687. Увольнение за утрату доверия к работнику 21.19 KB
  Для этого существует статья 81 Расторжение трудового договора по инициативе работодателя в частности пункт 7 данной статьи Увольнение сотрудника в связи с утратой к нему доверия. Так какие же лица подлежат увольнению по данной статье Можем ли мы уволить сотрудника по субъективному мнению о его нечестности...
76690. Синдром «менеджера» 815.8 KB
  Под синдромом менеджера (он же синдром хронической усталости или синдром выгорания) принято считать наличие следующих симптомов: быстрая утомляемость и изматывающая организм усталость, которая не проходит даже после отпуска, апатия, депрессия, беспричинные приступы гнева и др.
76691. Судоходные сооружения канала имени Москвы 74.5 KB
  Сооружения канала создают замечательный архитектурный ансамбль; каждый шлюз имеет особый облик. Башни шлюзов имеют завершения в виде декоративных надстроек или скульптур. Крупнейшим сооружением канала имени Москвы является Северный (Химкинский) речной вокзал, построенный по проекту А. М. Рухлядева...
76692. Будова й еволюція всесвіту 57 KB
  Наше Сонце також є рядовою зорею входить до складу нашої Галактики яка у свою чергу включена в Місцеве скупчення галактик. Молочний Шлях який ми бачимо на нічному небі у вигляді сріблястої смуги розсипаних зір становить основну частину нашої Галактики.
76693. Биологическая адаптация человека 151.5 KB
  Целью моей работы является изучение биологических и социальных аспектов адаптации человека ее опосредованный характер. Биологические и социальные аспекты адаптации человека Экология человека или социальная экология это область экологии изучающая взаимодействие человеческого общества и окружающей среды.