МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет “Львівська політехніка”
кафедра САПР
З В І Т
до лабораторної роботи №2
з курсу: “Геометричне моделювання у конструюванні інженерних об’єктів і систем”
на тему: “Афінні перетворення та анімація засобами мови TURBO PASCAL 7.0.”
Львів – 2005
1. МЕТА РОБОТИ
Мета роботи – ознайомитись із законами руху геометричних об’єктів на прощині та у
просторі. Оволодіти математичною мовою опису динаміки та візуалізації на основі
закономірностей геометричних перетворень. Набути практичних навиків розробки графічних
процедур у середовищі Turbo Pascal в графічному режимі.
2. ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. ГЕОМЕТРИЧНІ ПЕРЕТВОРЕННЯ ОСНОВНІ ПОНЯТТЯ ТА
СПІВВІДНОШЕННЯ
Геометричне перетворення – це відображення p'= f ( p) точки p ∈ Rn n-мірного
простору образу в точку p'∈ Rn' n'-мірного простору перетворення (де Rn - евклідів простір
розмірності n.
Геометричне перетворення поділяються на нелінійні (наприклад, відображення у
кривому дзеркалі) та лінійні.
Лінійне перетворення точки описується векторним рівнянням:
p'= pA + B
з матрицями перетворення A∈ Rn×n' та B ∈ R1×n' , що не залежать від вектора p.
У залежності від розмірності просторів n, n' та властивостей матриці А лінійні
перетворення поділяються на невироджені (афінні) та вироджені (проективні).
Властивості афінного перетворення:
n = n',rang(A) = n (де rang(A) – ранг матриці А, рівний числу її лінійно
незалежних строк чи стовпців), що означає квадратність та невиродженість матриці А.
Існування зворотної матриці А-1 дозволяє по точці p' відновити точку образу p:
p = ( p'−B)A−1
При проективному перетворенні m<n та не існує оберненої матриці А-1, тому
однозначне відновлення образу за прообразом неможливе через втрату інформації про одну чи
декілька координат образу.
Афінні перетворення (від англ. affinity – подібність) – точкові взаємно однозначні
відображення площини (простору) на себе, при яких прямі переходять у прямі. Якщо на
площині задана декартова система координат, то кожне афінне перетворення цієї площини
може бути визначене за допомогою так званого невирожденого лінійного перетворення
координат х та у точок цієї площини.
Загальний вид формул двовимірних афінних перетворень:
де x,y – координати початкового об’єкту, х', y' – координати перетвореного об’єкта.
Коефіцієнти перетворень aij зберігають у виді матриці, розширеної до квадратної:
, при цьому дуже просто обчислюються коефіцієнти довільного складного
перетворення, якщо відомі коефіцієнти перетворень, його складових. Для цього просто
перемножують відповідні матриці коефіцієнтів.
Аналогічно, кожне афінний простір може бути визначений за допомогою невирождених
лінійних перетворень координат точок простору. Сукупність усіх афінних перетворень
площини (простору) на себе утворить групу афінних перетворень. Це означає, зокрема , що
послідовне проведення двох афінни перетворень еквівалентно деякому одному афіннму
перетворенню.
Прикладами афінних перетворень можуть бути ортогональне перетворення (це
перетворення є переміщення чи площини чи простору, переміщення із дзеркальним
відображенням); перетворення подоби; рівномірне „стиснення”.
Рівномірне „стиснення” з коефіцієнтом k площини π до розташованого на ній прямої а
– перетворення, при якому точки а залишаються на місці, а кожна точка М, що не лежить на а
площини π зміщається по променю, що проходить через М перпендикулярно а, у таку точку
M', що відношення відстаней від М и М 'до а дорівнює k; аналогічно визначається рівномірне
"стиснення" простору до площини. Всяке афінне перетворення площини можна одержати,
виконавши деяке ортогональне перетворення і послідовне „стиснення” до деяких двох
перпендикулярним прямим. Кожне афінне перетворення простору можна здійснити за
допомогою деякого ортогонального перетворення і послідовних „стиснень” до деяких трьох
взаємно перпендикулярним площинам. При афінному перетворенні паралельні прямі та
площини перетворяться в паралельні прямі та площини. Властивості афінних перетворень
широко використовуються в різних розділах математики, механіки і теоретичної фізики. Так, у
геометрії афінні перетворення застосовуються для так званої афінної класифікації фігур. У
механіці афінні перетворення використовуються при вивченні малих деформацій безупинного
суцільного середовища; при таких деформаціях малі елементи середовища в першому
наближенні піддаються афінному перетворенню.
Афінне перетворення має наступні властивості:
1) відображає n-мірний об’єкт у n'-мірний – точку в точку, лінію в лінію, поверхню у
поверхню;
2) зберігає паралельність ліній та плоскостей;
3) зберігає пропорції паралельних об’єктів – довжин відрізків на паралельних прамих та
площин на паралельних площинах.
Ці властивості дозволяють будувати прообрази полігонів на площині та поліедрів у
просторі по кінцевому набору m точок їх вершин:
Надалі вершини i p' з’єднюються прямими лініями (ребрами) у потрібному порядку.
Система вершин та ребер складає каркасну (дротяну) модель полієдра. Для отримання об’ємної
моделі визначаються та зафарбовуються видимі грані.
Перетворення вектора 2 1 V = p − p , що з’єднює точки 1 p та 2 p ,
показує, що перетворення В, впливає на обидва кінця V, не впливає на V'.
Довільна комбінація N послідовних афінних перетворень
еквівалентна одному афінному перетворенню
з матрицями перетворення
Індивідуальне завдання:
14. Написати імітаційну програму з застосуванням афінних перетворень, яка дозволяє в
автоматичному режимі та при ручному керуванні створювати динамічно змінну
візуалізацію при якій моделюється феєрверк (салют) з обмеженням «часу життя»
осколків, що світяться поблискаючи різними кольорами.
Нижче приведена програмна реалізація феєрверку на Турбо Паскаль 7.0 з використанням
афінних перетворень таких як перенос. Феєрверк запускається з однієї точки в трьох
напрямках. Тобто імітується рух замальованого кола на екрані. Досягнувши визначеної
відстані точка розбивається на 6 частин (такі ж точки), які рухаються в різні сторони по
прямих відносно точки, де розривається феєрверк.
Код програми:
uses Graph,crt;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
procedure feer(x,dx:integer); // Процедура імітації феєрверку
var
y,dy,j,i:integer;
dx1,dx2,dx3,dx4,dx5,dx6,dy1,dy2,dy3,dy4,dy5,dy6:integer; // Визначення змінних, які
x1,x2,x3,x4,x5,x6,y1,y2,y3,y4,y5,y6:integer; // використовуються в процедурі
begin
y:=470; // початкове значення у=470
dy:=-random(5)-2; //задається приріст по у
delay(100); //затримуємо зображення на екрані
while (y>200) do begin
x:=x+dx; //визначаємо нову координату по х
y:=y+dy; // визначаємо нову координату по у
setcolor(random(14)); // встановлюємо колір випадковий (для мерехтіння кольорів)
circle(x,y,3); // малюємо в визначених координатах коло радіусом 3
for j:=3 downto 0 do circle(x,y,j); // замальовуємо коло поточним кольором
delay(3000); // Затримка зображення на екрані
setcolor(0); // встановлюємо чорний колір (фоновий)
circle(x,y,3); // малюємо в визначених координатах коло радіусом 3
for j:=3 downto 0 do circle(x,y,j); // замальовуємо коло поточним кольором
end;
dx1:=0; dy1:=-1; //визначаємо прирости для 1-го осколка феєрверку
dx2:=1; dy2:=1; // визначаємо прирости для 2-го осколка феєрверку
dx3:=-1; dy3:=0; // визначаємо прирости для 3-го осколка феєрверку
dx4:=1; dy4:=0; // визначаємо прирости для 4-го осколка феєрверку
dx5:=-1; dy5:=1; // визначаємо прирости для 5-го осколка феєрверку
dx6:=1; dy6:=2; // визначаємо прирости для 6-го осколка феєрверку
x1:=x; x2:=x; x3:=x; x4:=x; x5:=x; x6:=x; //Встановлюємо початкові координати х для осколків
y1:=y; y2:=y; y3:=y; y4:=y; y5:=y; y6:=y; //Встановлюємо початкові координати у для осколків
for I:=1 to 100 do // Цикл малювання руху осколків
begin
x1:=x1+dx1; x2:=x2+dx2; x3:=x3+dx3; // Рахуємо нові координати по х
x4:=x4+dx4; x5:=x5+dx5; x6:=x6+dx6; // Рахуємо нові координати по х
y1:=y1+dy1; y2:=y2+dy2; y3:=y3+dy3; // Рахуємо нові координати по у
y4:=y4+dy4; y5:=y5+dy5; y6:=y6+dy6; // Рахуємо нові координати по у
setcolor(random(14)); //встановлюємо колір випадковий (для мерехтіння кольорів)
for j:=3 downto 0 do circle(x1,y1,j); // малюємо 1-ий осколок поточним кольором
for j:=3 downto 0 do circle(x2,y2,j); // малюємо 2-ий осколок поточним кольором
for j:=3 downto 0 do circle(x3,y3,j); // малюємо 3-ий осколок поточним кольором
for j:=3 downto 0 do circle(x4,y4,j); // малюємо 4-ий осколок поточним кольором
for j:=3 downto 0 do circle(x5,y5,j); // малюємо 5-ий осколок поточним кольором
for j:=3 downto 0 do circle(x6,y6,j); // малюємо 6-ий осколок поточним кольором
delay(3000); // затримка зображення на екрані
setcolor(0); // встановлюємо поточний колір фону (чорний)
for j:=3 downto 0 do circle(x1,y1,j); // замальовуємо 1-ий осколок поточним кольором
for j:=3 downto 0 do circle(x2,y2,j); // замальовуємо 2-ий осколок поточним кольором
for j:=3 downto 0 do circle(x3,y3,j); // замальовуємо 3-ий осколок поточним кольором
for j:=3 downto 0 do circle(x4,y4,j); // замальовуємо 4-ий осколок поточним кольором
for j:=3 downto 0 do circle(x5,y5,j); // замальовуємо 5-ий осколок поточним кольором
for j:=3 downto 0 do circle(x6,y6,j); // замальовуємо 6-ий осколок поточним кольором
end;
end;
procedure initialize; // процедура ініціалізації графічного режиму
begin
grDriver := Detect; // детектуємо графічний драйвер
InitGraph(grDriver, grMode,''); // ініціалізуємо графічний режим
ErrCode := GraphResult; // повертаємо значення помилки
if ErrCode <> grOk then begin // перевірка чи є помилка чи ні, якщо є, то видача повідомлення
Writeln('Graphics error:', GraphErrorMsg(ErrCode)); halt(1); end; // і завершення роботи програми
end;
var
i:integer;
begin
initialize; // виклик процедури ініціалізації графіки
feer(320,-1); // перший феєрверк
feer(320,1); // другий феєрверк
feer(320,0); // третій феєрверк
readkey; // очікування зчитування клавіші для виходу з програми
end.
Висновок: В даній лабораторній роботі ми навчились використовувати афінні перетворення
для моделювання руху об’єктів. А також тут була написана програма моделювання
руху замальованого кола з використанням афінного перетворення «перенос», що
моделює феєрверк з розбиттям на осколки, які рухаються в різні сторони також
з застосуванням афінних перетворень.