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


 

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

53999. It Often Rains 58.5 KB
  Express your opinion in a chain. Mind the colour of your card. If you’ve got a green card you tell us about good points of the rainy weather; if your card is red you tell us about bad points of it.
54000. Science and Inventions “Scientists and their Contributions to the World Science” 134 KB
  Glad to hear that. The more so because I am going to give you some food for thought. As at the previous lessons we spoke about science and how it is important in our life, I think it won`t be difficult for you to understand and explain the meaning of the following words which were once said by a famous writer B.Shaw...
54001. Sports. Plural (irregular nouns) 223.5 KB
  On February we’ll have the world sport competitions which called the Olympic Games. There are winter and summer Olympic Games. The last summer Olympic Games were in Perkin in China. The next winter Olympic Games will take part in Vancouver in Canada. The team of our country will take part in these competitions.
54002. What’s the weather like? 148 KB
  Today we are going to speak about the weather, about your favourite seasons. You know, the weather is a safe topic for a conversation. That's why we should be good at it.
54003. Я сохраняю энергию 836.52 KB
  At the end of the lessons students are evaluated and given the hometask to create a group outcome project to be considered by school authority for further long-term implementment and for further its presentation as promotion of eco-consciousness among pupils of the gymnasium.
54004. We are Ukrainians 416.5 KB
  Objectives: to improve skills in speaking, reading, listening, to organize lexical material on the topic. To develop speech reaction, thinking, memory, attention and creativity of pupils, nurture positive attitude to the interlocutor, to bring up the lines of patriotism in pupils, love for his native land, motherland Ukraine.
54005. My family and friends 33.5 KB
  So, you’re right, we’ll talk about our families and friends but I realized that it is a little bit difficult for you to guess the topic of our today’s lesson and I hope next ex. will help you…
54006. SPORT 55 KB
  The equipment you need is skis, boots and poles. Clothes are very important too because they protect you from cold weather. You need a ski-suit, a hat, goggles to protect your eyes, socks, mittens.
54007. На життєві йдучи видноколи, не розтратьте найкращих чуттів, будьте гідні рідної школи, будьте гідні своїх вчителів! 108.5 KB
  Будьте гідні рідної школи Будьте гідні своїх вчителів за творчістю випускників Чернівецької гімназії № 5: Ірини Вільде Ореста Масикевича Володимира Кобилянського Дмитра Загула Тараса Унгуряна Андрія Шкургана Олександра Маслюченка Єлєни Даскал Мета: ознайомити учнів з цікавими фактами життя і творчості майстрів художнього слова які навчались у Чернівецькій гімназії № 5; через художнє слово ввести учнів у чарівний світ поезії; навчити аналізувати поетичні твори; розвивати творчі та комунікативні здібності вміння логічно мислити;...