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


 

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

19042. Уравнение Томаса-Ферми 127 KB
  Лекция 24 Уравнение ТомасаФерми Распределение заряда и электрического поля в атомах с учетом взаимодействия электронов друг с другом проводятся методами самосогласованного поля. Эти расчеты очень сложны и громоздки особенно многоэлектронных атомов. Но как раз дл
19043. Теория стационарных возмущений для состояний дискретного спектра. Случай невырожденного спектра 279 KB
  Лекция 25 Теория стационарных возмущений для состояний дискретного спектра. Случай невырожденного спектра Точное решение стационарного уравнения Шредингера как правило представляет собой существенную математическую проблему и возможно только для простейших кв...
19044. Теория стационарных возмущений в случае невырожденного спектра: примеры 309 KB
  Лекция 26 Теория стационарных возмущений в случае невырожденного спектра: примеры Рассмотрим несколько примеров. Пусть на одномерный гармонический осциллятор наложено возмущение . Найдем поправки первого и второго порядка к энергетическим уровням осциллятора. ...
19045. Теория стационарных возмущений для состояний дискретного спектра. Случай вырож-денного спектра 269.5 KB
  Лекция 27 Теория стационарных возмущений для состояний дискретного спектра. Случай вырожденного спектра Рассмотрим теперь случай когда невозмущенный оператор Гамильтона имеет вырожденные собственные значения. Пусть функции ... отвечают одному и тому же собст...
19046. Теория стационарных возмущений в случае вырожденного спектра. Примеры 441 KB
  Лекция 28 Теория стационарных возмущений в случае вырожденного спектра. Примеры Рассмотрим несколько примеров применения теории возмущений в случае вырожденного спектра. Пусть трехмерная частица находится в сферически симметричном потенциале в котором отсутст...
19047. Теория нестационарных возмущений. Переходы под влиянием возмущений, зависящих от времени 777 KB
  Лекция 29 Теория нестационарных возмущений. Переходы под влиянием возмущений зависящих от времени Согласно постулатам квантовой механики волновая функция любой квантовой системы удовлетворяет временному уравнению Шредингера 1 где гамильтониан системы...
19048. Теория нестационарных возмущений. Примеры 838 KB
  Лекция 30 Теория нестационарных возмущений. Примеры Рассмотрим примеры применения теории нестационарных возмущений для простейших квантовых систем. Пусть на гармонический осциллятор находящийся в основном состоянии начиная с момента времени действует малое в...
19049. Адиабатические и внезапные возмущения. Переходы под действием внезапных возмущений 1.15 MB
  Лекция 31 Адиабатические и внезапные возмущения. Переходы под действием внезапных возмущений Исследуем общую формулу для вероятностей переходов на предмет зависимости вероятности перехода 1 от времени действия возмущения некоторые элементы такого анали
19050. Переходы под действием периодических возмущений. Резонансное приближение. Переходы в непрерывный спектр 1.21 MB
  Лекция 32 Переходы под действием периодических возмущений. Резонансное приближение. Переходы в непрерывный спектр Рассмотрим теперь случай возмущений зависящих от времени периодически. Пусть на частицу находящуюся в стационарном состоянии с энергией действует