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


 

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

13512. Гомер (Homeros) 75.5 KB
  Гомер Гомер Homeros греческий поэт согласно древней традиции автор Илиады {Ilias и Одиссеи Odysseia двух больших эпопей открывающих историю европейской литературы. С XVIII в. в науке идет дискуссия как относительно авторства так и относительно истории создания Илиады и Од...
13513. Анна Ахматова 27.5 KB
  Анна Ахматова 1889-1966 Анна Ахматова псевдоним Горенко Анны Андреевны; 1889-1966 первое стихотворение по ее признанию написала в 11 лет в печати впервые выступила в 1907 году. Ее первый поэтический сборник Вечер вышел в 1912 году. Анна Ахматова принадлежала к группе а...
13514. Графические объекты 23 KB
  Графика Графические объекты компактно передают большой объем информации и оживляют Webстраницу. По принципу формирования изображений графика делится на растровую точечную векторную и фрактальную. Заметим что независимо от природы возникновения изображения на
13515. Глобальные вычислительные сети (ГВС) 22 KB
  Глобальные сети Глобальные сети как и локальные состоят из компьютеров соединенных каналами связи. Глобальные вычислительные сети ГВС всего мира объединены между собой с помощью Интернета. Для работы в ГВС пользователю необходимо иметь соответствующее аппаратн...
13516. Глобальные сети и управление ими 23 KB
  Глобальные сети Для реализации каждой сетевой услуги требуются своя программасервер и своя программаклиент. Например существуют почтовые серверы и клиенты. В то же время современные браузеры программынавигаторы исследователи обозреватели постепенно берут на...
13517. Способы подключения к Интернету 25 KB
  Способы подключения к Интернету В зависимости от своих финансовых возможностей пользователь выбирает один из трех основных способов подключения к Интернет: удаленный доступ по коммутируемой временно созданной телефонной линии; прямой доступ по выделенному по
13518. Коммутация каналов, сообщений и пакетов 23 KB
  Коммутация каналов сообщений и пакетов По способу передачи информации сети делятся на сети коммутации каналов сети коммутации сообщений и сети коммутации пакетов. При коммутации каналов образуется непосредственное физическое соединение двух узлов. Например ма
13519. Протоколы, службы, услуги 22.5 KB
  Протоколы службы услуги Глобальная сеть Интернет состоит из множества компьютеров работающих под управлением разных операционных систем на разных аппаратных платформах. Однако при обмене информацией все ЭВМ должны пользоваться едиными правилами соглашениями п
13520. Браузеры 23.5 KB
  Браузеры Браузерами называются программы которые считывают данные документы страницы с удаленных далеко расположенных компьютеровсерверов а затем демонстрируют их на компьютерахклиентах. Термин браузер происходит от английского слова browse означающего про...