68887

Аффінне перетворення координат при моделюванні динаміки об’єктів

Лекция

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

Перетворення координат графічних об’єктів використовуються вельми широко. Основні випадки: об’єкт описаний не в декартовій координатній системі зображення типових або таких, що повторюються деталей об’єкту побудова проекцій тривимірних об’єктів направлена деформація при синтезі нових форм мультиплікація.

Украинкский

2014-09-26

150 KB

0 чел.

ЛЕКЦІЯ 7

Аффінне перетворення координат при моделюванні динаміки об'єктів.

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

-  об'єкт описаний не в декартовій координатній системі

-  зображення типових  або таких, що повторюються  деталей об'єкту

-  побудова проекцій  тривимірних об'єктів

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

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

Розрізняють двовимірні ( 2d )  і  тривимірні ( 3d)

перетворення координат. Видів перетворень багато,  розглянемо тільки так звані  аффінні перетворення,  коли  в отримуваному зображенні об'єкту зберігається  прямолінійність і паралельність прямих, а також  ділення відрізань в заданих співвідношеннях.

Загальний вид формул  двовимірних  аффінних перетворень:

x* = a11  x + a12  y + a13

y* = a21  x + a22  y + a23

Тут  x, у -  координати  початкового,  а x*, y*  - перетвореного об'єкту.

Коефіцієнти перетворень а 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

де  з I J = а I 1 * b 1 J + а I 2 * b 2 J + а I 3 * b J 3

тобто для розрахунку елементу матриці,  розташованого в  I-строчці  і

J-столбці,  обчислюється сума добутків елементів цього рядка в матриці A  на відповідні елементи цього стовпця в  матриці

B.

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

У приведеній нижче програмі  лінійчата фігура задається у вигляді масивів координат її вершин  ха, уа  на кресленні  ( x, у  -  в

системі координат екрану ). Ці координати піддаються аффінним перетворенням, коефіцієнти перетворення зберігаються в

двовимірному масиві R.  Початковому положенню фігури відповідає одинична матриця  R  (одиниці на головній діагоналі, останні члени - нулі).

При черговому перетворенні коефіцієнти  матриці  R перераховуються шляхом множення  на неї матриці цього перетворення (А),  отримувана матриця (В)  знову записується  в R.  Нові координати  x, у  обчислюються в процедурі New_xy, яка викликається безпосередньо при виведенні фігури на екран процедурою  PICT.  Причому якщо встановити для малювання колір фону

то перерахунок координат проводитися не буде, що приведе до стирання старого зображення фігури - це зручно при імітації руху.

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


uses Graph, Crt;

var Gd, Gm, n, i, j, до, xc, ус:  integer;

ха, уа: array[1..50] of  real;  координати фігури на кресленні }

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

а, 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

}

{--------------------------------------------------------------------------------------}

ПРОЦЕДУРА 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

- перерахунок базових координат  ха, уа. }

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 - для у)

без зсуву центру фігури }

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, ус. }

ROTATE( beta);  поворот відносно початку координат }

TRAN(xc, ус);  зворотний зсув фігури }end;

{---------------------------------------------------------------------------------------}

PROCEDURE AXES( alfa, beta:  real);

{ розрахунок матриць  А і  R зсуву осей координат (деформація зрушення) вісь x зміщується на кут  alfa,  вісь  у - на кут  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

паралельній осі Х 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, вус, 12);  зсув центру xc,yc }

TRAN(3, 2);  перенесення фігури відповідно зсуву центру }

Rot_xy(xc, вус, -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


 

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

34923. ВВП и другие показатели дохода 32 KB
  ВВП и другие показатели дохода Основным макроэкономическим показателем рыночной экономики безусловно является ВВП. Следует заметить что в ВВП не включается стоимость промежуточных товаров и услуг которые необходимы для осуществления самого процесса производства поскольку они уже входят в стоимость товарной продукции. ВВП это внутренний продукт поскольку в его создании участвуют только резиденты данной страны т. Соответственно в первом случае мы имеем ВВП и ВНД а вычитая из них потребление основного капитала мы получаем чистый...
34924. Виды и причины возникновения инфляции. Кривая Филипса 34 KB
  Виды инфляции: Инфляция спроса порождается избытком совокупного спроса по сравнению с реальным объемом производства. Дефицит товара Инфляция предложения издержек рост цен вызван увеличением издержек производства в условиях недоиспользованных производственных ресурсов. Сбалансированная инфляция цены различных товаров остаются неизменными друг относительно друга. Несбалансированная инфляция цены различных товаров изменяются по отношению друг к другу в различных пропорциях.
34926. Возникновение, сущность, виды и функции денег 57 KB
  О наличии денег на хранении выдавался сертификат квитанция который удостоверял что деньги находятся у банкира на хранении и предъявитель сей бумаги получит определённую сумму. Со временем эти сертификаты стали иметь такую же силу как и реальные деньги. Так появились первые бумажные деньги возникшие из практики использования банковских сертификатов квитанций. Деньги специфический товар который является универсальным эквивалентом стоимости других товаров или услуг.
34927. Государственный бюджет 26 KB
  Деятельность государства по формированию рассмотрению утверждению исполнению бюджета а также составлению и утверждению отчёта об его исполнении формулировка касается бюджетов всех уровней входящих в бюджетную систему РФ называется бюджетный проце́сс. Если запланированные расходы бюджета превышают доходы бюджета то это называется бюджетный дефицит или дефицит бюджета. Когда при исполнении бюджета уровень дефицита бюджета превышает установленный при утверждении бюджета показатель или происходит значительное снижение ожидавшихся...
34928. Государственный долг. Экономический анализ государственного долга 28 KB
  Государственный долг возникает вследствие существования дефицита бюджета в определенные периоды времени. Когда расходы государства превышают его доходы, правительство вынужденно искать источники финансирования возникшего разрыва.
34929. Группы издержек производства 36.5 KB
  Внешние(явные, бухгалтерские) – денежные платежи, которые производит фирма за приобретенные ресурсы поставщику, обеспечивающие его таким доходом, чтобы он не направлял ресурсы в альтернативное производство, образует себестоимость
34930. Денежные теории 40 KB
  Фридмен реформировал количественную теорию денег основываясь на существующих разработках трансакционном варианте и. По мнению Фридмена деньги имеют значение для динамики цен и что важно именно количество денег а не процентные ставки влияют на состояние денежного рынка или условия выдачи кредитов. В монетаристском варианте количественной теории денег важное место отводится ожидаемым изменениям уровня цен как фактора действующего на размеры кассовых денежных резервов и других финансовых активов находящихся в распоряжении...
34931. Закон Оукена. Экономический смысл. Социально-экономические последствия безработицы 33 KB
  Социальноэкономические последствия безработицы. Закон Оукена эмпирическая зависимость между темпом роста безработицы и темпом роста ВНП в США начала 60х годов предполагающая что превышение уровня безработицы на 1 над уровнем естественной безработицы снижает реальный ВНП по сравнению с потенциальным на 25 . Y − Y Y = − Buc Y фактический ВНП Y потенциальный ВНП uc уровень циклической безработицы B эмпирический коэффициент чувствительности обычно принимается 2. Следствие из закона Оукена: Y1 − Y0 Y0 =...