Морфінг

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Звіт про виконання розрахункової роботи
Предмет:
Інші
Група:
КН-11

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет «Львівська Політехніка»  Звіт Про виконання розрахункової роботи з комп’ютерної графіки на тему: «Морфінг» Теоретичні відомості Морфінг - це плавне "перетворення" одного зображення на інше, під час якого конкретний елемент першого зображення "перетікає" в елемент другого зображення. Наприклад, при морфінгу одного автомобіля в іншій, колесо першого перетворюється на колесо другого. Комп'ютер не може виконати морфінг двох зображень самостійно - спочатку художникові потрібно задати відповідність елементів першого зображення елементам другого а також інші параметри, користуючись спеціальним редактором. Спосіб завдання відповідності залежить від редактора - це можуть бути крапки, лінії, полігони. Сам морфінг можна розбити на три частини: warping, tweening і dissolving. Warping - перетворення зображення, при якому воно в окремих областях стискається і розтягується, ніби зображення нанесене на гуму. Розрахунок кожної точки цього зображення здійснюється по математичних формулам залежно від відповідності елементів зображення, яке задав художник. Під час warping'у елементи зображення намагаються прийняти положення і форму елементів другого зображення. Tweening (побудова проміжних кадрів) - інтерполяція двох зображень для отримання плавної анімації. Наприклад, якщо відповідність елементів зображень задана крапками, то інтерполяцією положень крапок можна отримати проміжні відповідності. Dissolving (розчиняти, в кіно cross-dissolving - затемнення однієї сцени і освітлення інший) - злиття двох зображень, при якому колір кожної точки нового зображення береться як суміш кольорів відповідних точок двох початкових зображень в заданій пропорції. Tweening застосовує warping для інтерпольованих крапок, тобто дозволяє отримати проміжні фази. Dissolving об’єднує два отримані зображення в одне. В цілому при морфінгу перший об’єкт плавно намагається прийняти форму другого, а другий, прийнявши форму першого, намагається повернутися до нормальної форми. Dissolving змішує зображення, при цьому зображення першого об’єкта поступово затухає, а другого - з'являється. АЛГОРИТМИ Алгоритм залежить від необхідної якості, швидкості і способу завдання відповідності елементів зображень. Зручно задавати відповідність використовуючи сітку. Щільність сітки впливає на швидкість обчислень, вимоги до пам'яті, якість отримуваного зображення. Редактор, що надає інші способи завдання відповідностей, повинен привести їх до сітки. Сітка задається вузлами, і саме ці вузли (крапки) при tweenig'е плавно рухаються від свого першого положення в друге, тобто tweening морфує сітку. Warping здійснюється відповідно до початкової сітки і сітки, отриманої для даного кадру. Для вузлових точок це легко: ми знаємо, що в початковій сітці вузол знаходився в крапці (x,y) з кольором с. Означає в необхідній картинці крапка, в якій тепер знаходиться вузол, має колір с. Для решти крапок дещо складніше: тут застосовується білінійна або бікубічна інтерполяція. При виконанні даної розрахункової роботи я користувався алгоритмом геометричного морфінгу. Розглянемо процес морфінгу опуклої Фігури А в опуклу Фігуру B. Хай морфінг проводиться протягом проміжку часу [0,1]. Необхідно вказати для кожного моменту часу t з [0,1] фігуру AB(t) таку, що AB(0)= A, AB(1)= B, причому зміна AB з часом - плавна. Етап I. Створення описуючих фігур. Через грані фігури А проводяться прямі - назвемо їх обмежуючими прямими. Фігура, що обмежується цими прямими, - A''. Проводиться паралельне перенесення обмежуючих прямих так, щоб A'' була мінімальною фігурою, що містить фігуру B (Мал. 2). Паралельне перенесення граней окремо показане на Ріс.2a, 2b, 2c. На Мал. 2d показаний результат: початкова фігура "описала" кінцеву. Якщо проводити перенесення протягом кінцевого проміжку часу, отримаємо морфінг А в А'': A' = A'(t) A'(0)= A A'(1)= A'' Аналогічно створюється образ B'' фігури B, що містить фігуру А, і морфінг B' = B'(t). Побудова образу показана на Мал. 3a-d. / Ріс.2 Створення описуючих фігур. / Ріс.3 Створення описуючих фігур. Етап II. Морфінг. Для того, щоб побудувати безперервне морфінг фігур A і B один в одного, одночасно проводиться морфінг A в A' і B' в B. Для кожного t з [0,1] будується фігура AB'(t), що є перетином A'(t) і B'(t). Процес отримання проміжних фігур показаний на Мал. 4а. Результат показаний на Мал. 4b. / Ріс.4а Процес морфінгу. / Ріс.4b Процес морфінгу. Відмітимо, що: AB'(0)= A AB'(1)= B AB змінюється плавно з часом Таким чином, AB'(t) - морфінг між фігурами A і B. Текст програми, що реалізує морфінг unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, ComCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; ColorDialog1: TColorDialog; N6: TMenuItem; Onfo1: TMenuItem; procedure Button1Click(Sender: TObject); function getK(A:TPoint;B:TPoint):Double; function getB(A:TPoint;B:TPoint):Double; function isInTriangle(a:TPoint):boolean; function isUnderLine(a,b,c:TPoint):boolean; function getNewB(a,b,c:TPoint):double; procedure Timer1Timer(Sender: TObject); function getPoint(kab,bab,kcd,bcd:Double):TPoint; function pointOfCrossing(kab,bab,kcd,bcd:Double):TPoint; procedure N6Click(Sender: TObject); function ChangeColor(InputColor: TColor; Lighten: Boolean; m: Extended): TColor; procedure N3Click(Sender: TObject); procedure Onfo1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; triangle: Array [1..3] of TPoint;//початкові точки трикуттника quadrangle: Array [1..4] of TPoint;//початкові точки чотирикутника kab3,kac3,kbc3,bab3,bac3,bbc3:Double;//кутові коефіцієнти і зміщення сторін фігур curbab3,curbac3,curbbc3,endbab3,endbac3,endbbc3:Double; curbab4,curbbc4,curbcd4,curbda4:Double; kab4,kda4,kbc4,kcd4,bab4,bda4,bbc4,bcd4:Double; endbab4,endbbc4,endbcd4,endbda4:Double; trian: Array [1..3] of TPoint; quadran: Array [1..4] of TPoint; n,ncur:Integer; curFigure: Array [1..7] of TPoint; Timer1:TTimer; dbab3,dbac3,dbbc3,dbab4,dbad4,dbbc4,dbcd4:Double; curColor:TColor; inverse:boolean; t,l:Integer; implementation uses Types, DateUtils; {$R *.dfm} function TForm1.ChangeColor(InputColor: TColor; Lighten: Boolean; m: Extended): TColor; var r,g,b: extended; begin r := GetRValue(InputColor); g := GetGValue(InputColor); b := GetBValue(InputColor); if Lighten = True then begin r := r+(((r+1)/255)*m); g := g+(((g+1)/255)*m); b := b+(((b+1)/255)*m); end else begin r := r-(((r+1)/255)*m); g := g-(((g+1)/255)*m); b := b-(((b+1)/255)*m); end; if r > 255 then r := 255; if r < 0 then r := 0; if g > 255 then g := 255; if g < 0 then g := 0; if b > 255 then b := 255; if b < 0 then b := 0; Result := RGB(byte(Round(r)),byte(Round(g)),byte(Round(b))); end; function TForm1.pointOfCrossing(kab,bab,kcd,bcd:Double):TPoint; var p:TPoint; begin p.X:=round((bcd-bab)/(kab-kcd)); p.Y:=round(kab*p.X+bab); pointOfCrossing:=p; end; function TForm1.getPoint(kab,bab,kcd,bcd:Double):TPoint; var p:TPoint; begin if kcd=0 then begin p.Y:=Round(bcd); p.X:=round((p.Y-bab)/kab); end else begin p.X:=round(bcd); p.Y:=round(kab*p.X+bab); end; getPoint:=p; end; function TForm1.getNewB(a,b,c:TPoint):double; begin getNewB:=a.Y-getK(b,c)*a.X; end; function TForm1.isUnderLine(a,b,c:TPoint):boolean; begin if a.Y-(getK(b,c)*a.X+getB(b,c))>0 then isUnderLine:=true else isUnderLine:=false; end; function TForm1.isInTriangle(a:TPoint):boolean; begin if ((a.Y-kbc3*a.X-curbbc3)>0)and((a.Y-kab3*a.X-curbab3)<0)and((a.y-kac3*a.X-curbac3)<0) then isInTriangle:=true else isInTriangle:=false; end; function TForm1.getK(A:TPoint;B:TPoint):Double; //функція повертає кутовий коефіцієнт сторони AB begin getK:=(b.Y-a.Y)/(b.X-a.X); end; function TForm1.getB(A:TPoint;B:TPoint):Double; //функція повертає зміщення сторони AB begin getB:=A.Y-a.X*(b.Y-a.Y)/(b.X-a.X); end; procedure TForm1.Button1Click(Sender: TObject); var d,q:Integer; begin t:=40; d:=20; q:=50; ncur:=1; l:=3; n:=50;//к-сть кроків морфінгу inverse:=false; //побудова трикутника і чотирикутника triangle[1].X:=400+q; triangle[1].Y:=400+d; triangle[2].X:=100+q; triangle[2].Y:=250+d;//50;//150; triangle[3].X:=550+q;//450; triangle[3].Y:=50+d;//150; //=============================================== quadrangle[1].X:=170+q; quadrangle[1].Y:=120+d; quadrangle[2].X:=170+q; quadrangle[2].Y:=300+d; quadrangle[3].X:=500+q; quadrangle[3].Y:=300+d; quadrangle[4].X:=500+q; quadrangle[4].Y:=120+d; //=================================================== kab3:=getK(triangle[1],triangle[2]); bab3:=getB(triangle[1],triangle[2]); kac3:=getK(triangle[1],triangle[3]); bac3:=getB(triangle[1],triangle[3]); kbc3:=getK(triangle[2],triangle[3]); bbc3:=getB(triangle[2],triangle[3]); //==================================================== bab4:=quadrangle[2].X; kbc4:=getK(quadrangle[2],quadrangle[3]); bbc4:=quadrangle[2].Y;//getB(quadrangle[2],quadrangle[3]); bcd4:=quadrangle[3].X; kda4:=getK(quadrangle[4],quadrangle[1]); bda4:=quadrangle[4].Y;//getB(quadrangle[4],quadrangle[1]); //====================================================== endbab3:=getNewB(quadrangle[2],triangle[1],triangle[2]); endbac3:=getNewB(quadrangle[3],triangle[1],triangle[3]); endbbc3:=getNewB(quadrangle[1],triangle[2],triangle[3]); trian[1].X:=round((endbab3-endbac3)/(-kab3+kac3)); trian[1].Y:=round(kab3*trian[1].X+endbab3); trian[2].X:=round((endbab3-endbbc3)/(-kab3+kbc3)); trian[2].Y:=round(kab3*trian[2].X+endbab3); trian[3].X:=round((endbac3-endbbc3)/(-kac3+kbc3)); trian[3].Y:=round(kac3*trian[3].X+endbac3); //========================================================= quadran[1].X:=triangle[2].X; quadran[2].X:=triangle[2].X; quadran[2].Y:=triangle[1].Y; quadran[3].Y:=triangle[1].Y; quadran[3].X:=triangle[3].X; quadran[4].X:=triangle[3].X; quadran[4].Y:=triangle[3].Y;//quadrangle[4].Y; quadran[1].Y:=triangle[3].Y;//quadrangle[4].Y; //===============Цикл морфінгу============================ dbab3:=-(bab3-endbab3)/n; dbac3:=-(bac3-endbac3)/n; dbbc3:=-(bbc3-endbbc3)/n; dbab4:=-(quadran[1].X-quadrangle[1].X)/n; dbcd4:=-(quadran[3].X-quadrangle[3].X)/n; dbbc4:=-(quadran[3].Y-quadrangle[3].Y)/n; dbad4:=-(quadran[1].Y-quadrangle[1].Y)/n; endbab4:=quadrangle[2].X; endbbc4:=quadrangle[2].Y; endbcd4:=quadrangle[4].X; endbda4:=quadrangle[4].Y; curbab3:=bab3; curbac3:=bac3; curbbc3:=bbc3; curbab4:=quadran[2].X; curbbc4:=quadran[2].Y; curbcd4:=quadran[4].X; curbda4:=quadran[4].Y; With PaintBox1.Canvas do begin curColor:=ColorDialog1.Color; Brush.Color:=curColor; Polygon(triangle); end; //======================================================== Timer1:=TTimer.Create(Form1); Timer1.Interval:=t; Timer1.OnTimer:=Timer1Timer; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if inverse=false {ncur <n} then begin Timer1.Interval:=t; curbab3:=curbab3+dbab3; curbac3:=curbac3+dbac3; curbbc3:=curbbc3+dbbc3; curbab4:=curbab4+dbab4; curbbc4:=curbbc4+dbbc4; curbcd4:=curbcd4+dbcd4; curbda4:=curbda4+dbad4; curFigure[1]:=getPoint(kbc3,curbbc3,0,curbda4); curFigure[2]:=getPoint(kbc3,curbbc3,1,curbab4); curFigure[3]:=getPoint(kab3,curbab3,1,curbab4); curFigure[4]:=getPoint(kab3,curbab3,0,curbbc4); curFigure[5]:=getPoint(kac3,curbac3,0,curbbc4); curFigure[6]:=getPoint(kac3,curbac3,1,curbcd4); c.X:=round(curbcd4); c.Y:=round(curbda4); curFigure[7]:=c ; PaintBox1.Refresh; with PaintBox1.Canvas do begin curColor:=ChangeColor(curColor,false,l); Brush.Color:=curColor;//+ncur*dColor; Polygon(curFigure); end; ncur:=ncur+1; if ncur = n then begin PaintBox1.Refresh; with PaintBox1.Canvas do begin curColor:=ChangeColor(curColor,false,l); Brush.Color:=curColor;//+ncur*dColor; Polygon(quadrangle); end; ncur:=1; inverse:=true; Timer1.Interval:=2000; end; end else begin Timer1.Interval:=t; curbab3:=curbab3-dbab3; curbac3:=curbac3-dbac3; curbbc3:=curbbc3-dbbc3; curbab4:=curbab4-dbab4; curbbc4:=curbbc4-dbbc4; curbcd4:=curbcd4-dbcd4; curbda4:=curbda4-dbad4; curFigure[1]:=getPoint(kbc3,curbbc3,0,curbda4); curFigure[2]:=getPoint(kbc3,curbbc3,1,curbab4); curFigure[3]:=getPoint(kab3,curbab3,1,curbab4); curFigure[4]:=getPoint(kab3,curbab3,0,curbbc4); curFigure[5]:=getPoint(kac3,curbac3,0,curbbc4); curFigure[6]:=getPoint(kac3,curbac3,1,curbcd4); c.X:=round(curbcd4); c.Y:=round(curbda4); curFigure[7]:=c ; PaintBox1.Refresh; with PaintBox1.Canvas do begin curColor:=ChangeColor(curColor,true,l); Brush.Color:=curColor; Polygon(curFigure); end; ncur:=ncur+1; if ncur = n then begin PaintBox1.Refresh; with PaintBox1.Canvas do begin curColor:=ChangeColor(curColor,true,l); Brush.Color:=curColor;//+dColor; Polygon(triangle); end; ncur:=1; inverse:=false; Timer1.Interval:=2000; end; end; end; {procedure TForm1.N4Click(Sender: TObject); begin ColorDialog1.Execute; trcolor:=ColorDialog1.Color; end; procedure TForm1.N5Click(Sender: TObject); begin ColorDialog1.Execute; qcolor:=ColorDialog1.Color; end; } procedure TForm1.N6Click(Sender: TObject); begin Close; end; procedure TForm1.N3Click(Sender: TObject); begin ColorDialog1.Execute; curColor:=ColorDialog1.Color; end; procedure TForm1.Onfo1Click(Sender: TObject); begin ShowMessage('Розрахукнова робота на тему "Морфінг". Виконав Хомишин І.В.'); end; end. Розроблена програма є досить простою. Від користувача вимагається тільки запуск морфінгу в меню. Також є можливість задавати колір початкової фігури, який теж змінюється в процесі морфінгу. Результат роботи програми ////// Висновок: виконуючи дану розрахункову роботу, я ознайомився з таким графічним ефектом як морфінг, з областю його застосування та алгоритмом виконання. А також написав програму, яка його реалізує.
Антиботан аватар за замовчуванням

22.11.2012 03:11-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!