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


 

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

65319. ПРАВОВЕ РЕГУЛЮВАННЯ ВИКОНАННЯ ПОДАТКОВОГО ОБОВ’ЯЗКУ 150 KB
  Забезпечення реальної можливості здійснення податкового обов’язку один із головних напрямків фінансової політики держави. Ефективність процедурноправового регулювання виконання податкового обов’язку безпосередньо впливає в першу чергу на забезпечення безумовної...
65321. МЕТОДИ ПРИСКОРЕНОГО КРИПТОАНАЛІЗУ БСШ НА ОСНОВІ АНАЛІЗУ ПОКАЗНИКІВ СТІЙКОСТІ ЗМЕНШЕНИХ МОДЕЛЕЙ ПРОТОТИПІВ 554 KB
  Відмічене визначає актуальність теми дисертаційної роботи направленої на вдосконалення методик оцінки показників стійкості БСШ до атак диференційного і лінійного криптоаналізу в інтересах в першу чергу підвищення якості і надійності...
65322. МУЛЬТИАГЕНТНІ МЕТОДИ ПОБУДОВИ НЕЙРО-НЕЧІТКИХ МЕРЕЖ 1.04 MB
  Проте методи навчання що використовуються при побудові нейронечітких мереж характеризуються недоліками пов’язаними з проблемою встановлення параметрів навчання вимагають участі користувача вимогою диференційованості функцій належності до нечітких термів...
65323. МОДЕЛІ АВТОМАТИЗОВАНОГО СИСТЕМНОГО ПРОЕКТУВАННЯ АВТОМАТИЧНОЇ ТРАНСМІСІЇ 663.5 KB
  Метою роботи є підвищення ефективності синтезу АТ за рахунок розробки математичних моделей автоматизованого проектування АТ та її блоків системи автоматичного управління САУ та її елементів зв’язків між ними вибору програмного забезпечення...
65324. ОБГРУНТУВАННЯ ПАРАМЕТРІВ ЗАСОБІВ ІНДИВІДУАЛЬНОГО ПРОТИГАЗОТЕПЛОВОГО ЗАХИСТУ ГІРНИКІВ 341.5 KB
  Тому розробка і створення індивідуальних засобів протигазотеплового захисту гірників членів ДГК є актуальним науковотехнічним завданням вирішення якого дозволить підвищити безпеку та ефективність ведення робіт в умовах нагрівального мікроклімату.
65325. ПЕРЕТРАВНІСТЬ КОРМУ, ОБМІН РЕЧОВИН І ПРОДУКТИВНІСТЬ КУРЕЙ-НЕСУЧОК ЗА РІЗНОГО РІВНЯ ТА СПІВВІДНОШЕННЯ СІРКИ І СЕЛЕНУ В КОМБІКОРМІ 283 KB
  Доведена доцільність використання в якості джерела сірки сульфату натрію оптимальна кількість якого в комбікормах для курчатбройлерів та ремонтного молодняку курей становить 03 від маси корму для каченят і гусенят − 10 а для курейнесучок − 05 від маси комбікорму.
65326. НЕЙРОМЕРЕЖНА ОБРОБКА БАГАТОВИМІРНИХ СИГНАЛІВ 457 KB
  Обрана тема дисертаційної роботи є актуальною тому що штучні нейронні мережі ШНМ протягом останнього часу переконливо довели свою ефективність при вирішенні різноманітних задач адаптивної обробки інформації таких як апроксимація нелінійних функцій класифікація управління...
65327. ОРГАНІЗАЦІЯ РОЗСЛІДУВАННЯ ЗЛОЧИНІВ ТА ЇЇ МІСЦЕ У СТРУКТУРІ КРИМІНАЛІСТИКИ 147.5 KB
  Чільне місце серед функцій держави займає правоохоронна яка реалізується зокрема за допомогою організації розслідування злочинів. Організаційна діяльність дозволяє підвищувати ефективність розслідування сприяє його всебічності повноті та об’єктивності...