Тривимірні перетворення

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

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

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

Рік:
2008
Тип роботи:
Лабораторна робота
Предмет:
Комп'ютерна графіка
Група:
КН

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

Міністерство освіти та науки України Національний університет «Львівська політехніка» Кафедра автоматизованих систем управління  Лабораторна робота №2 з дисципліни «Комп’ютерна графіка» на тему: “ Тривимірні перетворення”. Мета: Ознайомлення з основами комп‘ютерної графіки. Теоретичні основи. Для кращого сприйняття форми об'єкта необхідно мати його зображення в тривимірному просторі. У багатьох випадках наочне представлення про об'єкт можна одержати шляхом виконання операцій обертання і переносу, а також побудови проекцій. Введемо однорідні координати. Точка в тривимірному просторі  задається чотиримірним вектором  чи . Перетворення з однорідних координат описується співвідношеннями  (4.1) де T - деяка матриця перетворення.  Ця матриця може бути представлена у вигляді 4 окремих частин  Матриця 3x3 здійснює лінійне перетворення у виді зміни масштабу, зсуву й обертання. Матриця-рядок 1х3 робить перенос, а матриця-стовпець 3х1 - перетворення в перспективі. Останній скалярний елемент виконує загальну зміну масштабу. Повне перетворення, отримане шляхом впливу на вектор положення матрицею 4x4 і нормалізації перетвореного вектора, будемо називати білінійним перетворенням. Воно забезпечує виконання комплексу операцій зсуву, часткової зміни масштабу, обертання, відображення, переносу, а також зміни масштабу зображення в цілому. Тривимірна зміна масштабу Діагональні елементи основної матриці перетворення 4х4 здійснюють часткову і повну зміну масштабу. Розглянемо перетворення , (4.2) яке робить часткову зміну масштабу. На рис.4.1а показане перетворення паралелепіпеда в одиничний куб шляхом зміни масштабу. Загальна зміна масштабу виходить за рахунок використання четвертого діагонального елемента, тобто . (4.3) (4.4) Тривимірний зсув Недіагональні елементи верхньої лівої підматриці 3х3 від загальної матриці перетворення розміру 4х4 здійснюють зсуви в трьох вимірах, тобто . (4.5) Простий тривимірний зсув одиничного куба показаний на рис.4.1в. Тривимірні обертання Раніше було показано, що матриця 3х3 забезпечувала комбінацію операцій зміни масштабу і зсуву. Однак, якщо визначник матриці 3х3 дорівнює +1, то має місце чисте обертання навколо початку координат. Перед розглядом загального випадку тривимірного обертання навколо довільної осі дослідимо кілька окремих випадків. При обертанні навколо осі х розміри уздовж осі х не змінюються. Таким чином, матриця перетворень буде мати нулі в першому рядку і першому стовпці, за винятком одиниці на головній діагоналі. Це приводить до матриці перетворення, що відповідає повороту на кут  навколо осі х і задається співвідношенням  (4.6) Обертання вважається додатнім, тобто за годинниковою стрілкою, якщо дивитися з початку координат вздовж осі обертання. На рис.4.2а показаний поворот на -90° навколо осі x. Для обертання на кут Ф навколо осі y - нулі ставлять у другому рядку і другому стовпці матриці перетворення, за винятком одиниці на головній діагоналі. Повна матриця задається виразом  (4.7) Аналогічно матриця перетворення для обертання на кут  навколо осі z має вид  (4.8) Відображення в просторі Іноді потрібно виконати дзеркальне відображення тривимірного зображення. У трьох вимірах найпростіше відображення здійснюється щодо площини. Для відображення без зміни масштабів необхідно, щоб визначник перетворення дорівнював -1,0. При відображенні щодо площини xy змінюється тільки знак координати z. Отже, матриця перетворення для відображення щодо площини xy має вигляд  (4.11) Відображення одиничного куба щодо площини ху показане на рис.4.4. Для відображення щодо площини уz  (4.12) а для відображення щодо площини xz  (4.13) Відображення щодо інших площин можна одержати шляхом комбінації обертання і відображення. Просторовий перенос Тривимірний лінійний перенос зображення задається виразом  (4.14) Після перемножування одержимо  (4.15) Тривимірне обертання навколо довільної осі Метод двовимірного плоского обертання навколо довільної осі був розглянений раніше. Узагальненням цього методу є спосіб обертання навколо довільної осі в тривимірному просторі. Як і для плоского випадку, розглянена процедура полягає в переносі зображення і заданої осі обертання, що забезпечує обертання навколо осі, що проходить через початок координат. Метод тривимірного обертання полягає в лінійному переносі, обертанні навколо початку координат і зворотньому лінійному переносі у вихідне положення. Якщо вісь, навколо якої виконується обертання, проходить через точку А = , то матриця перетворення визначається наступним виразом:  (4.16) Текст програми unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus; type TForm1 = class(TForm) Image1: TImage; MainMenu1: TMainMenu; Grapher1: TMenuItem; Clear1: TMenuItem; Exit1: TMenuItem; XX: TEdit; YY: TEdit; ZZ: TEdit; HH: TEdit; WW: TEdit; DD: TEdit; Button1: TButton; a: TEdit; b: TEdit; c: TEdit; d: TEdit; e: TEdit; f: TEdit; g: TEdit; h: TEdit; i: TEdit; j: TEdit; k: TEdit; l: TEdit; m: TEdit; n: TEdit; p: TEdit; o: TEdit; Button2: TButton; ransform1: TMenuItem; Button3: TButton; Zmenwennjapoy1: TMenuItem; ruvumirnujzsuv1: TMenuItem; Obertna270protu1: TMenuItem; Vidobragvprostorydoxy1: TMenuItem; Prostorovuyperenospoyvkraz1: TMenuItem; Obertannjanavkoloosiy1: TMenuItem; procedure FormCreate(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Clear1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure ruvumirnujzsuv1Click(Sender: TObject); procedure Obertna270protu1Click(Sender: TObject); procedure Vidobragvprostorydoxy1Click(Sender: TObject); procedure Prostorovuyperenospoyvkraz1Click(Sender: TObject); procedure Obertannjanavkoloosiy1Click(Sender: TObject); procedure Zmenwennjapoy1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type point_ = class x,y,z,h:integer; constructor create(x1,y1,z1:integer); procedure paint(img: TImage); procedure trans(a,b,c,d,e,f,g,h,i,j,k,l,m,n,p,o:integer); procedure small(t1, t2, t3: integer); end; type figura = class a,b,c,d,a1,b1,c1,d1:point_; constructor create(o1:point_;hh,ww,dd:integer); procedure build_me(where:TImage); procedure transer(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3:integer); procedure small(t_1, t_2, t_3: integer); end; var ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, a1, b1, c1, d1: integer; a1x, a1y, a1z, b1x, b1y, b1z, c1x, c1y, c1z, d1x, d1y, d1z, a11, b11, c11, d11: integer; ddz, center_x, center_y, w, h, new_x, new_y, new_z, cen_x, cen_y: integer; Form1: TForm1; pointer: Point_; figa: figura; implementation {$R *.DFM} constructor point_.create(x1, y1, z1: integer); begin x := x1; y := y1; z := z1; h := 1; end; procedure point_.paint(img: TImage); var width, height: integer; center_x, center_y : integer; begin width := img.Width; height := img.Height; center_x := width div 2; center_y := height div 2; img.canvas.pen.color := clRed; img.Canvas.Ellipse(center_x + x*10 - z*10 - 3, center_y - y*10 + z*10 - 3, center_x + x*10 - z*10 + 3, center_y - y*10 + z*10 + 3); img.canvas.pen.color := clBlack; end; procedure point_.trans(a,b,c,d,e,f,g,h,i,j,k,l,m,n,p,o:integer); var HH, x1, y1, z1: integer; begin x1 := x; y1 := y; z1 := z; x := x1*a + y1*e + z1*i + m; y := x1*b + y1*f + z1*j + n; z := x1*c + y1*g + z1*k + p; HH := x1*d + y1*h + z1*l + o; if (HH <> 1)and(HH <> 0) then begin x := x div HH; y := y div HH; z := z div HH; end; end; procedure point_.small(t1, t2, t3: integer); var x1, y1, z1: integer; begin x1 := x; y1 := y; z1 := z; x := Round(x1/t1); y := Round(y1/t2); z := Round(z1/t3); end; procedure figura.small(t_1, t_2, t_3 : integer); begin a.small(t_1, t_2, t_3); a1.small(t_1, t_2, t_3); b.small(t_1, t_2, t_3); b1.small(t_1, t_2, t_3); c.small(t_1, t_2, t_3); c1.small(t_1, t_2, t_3); d.small(t_1, t_2, t_3); d1.small(t_1, t_2, t_3); end; procedure figura.transer(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3:integer); begin a.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); a1.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); b.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); b1.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); c.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); c1.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); d.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); d1.trans(a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,p3,o3); end; constructor figura.create(o1:Point_; HH, WW, DD: integer); begin a := point_.create(1,1,1); a1:= point_.create(1,1,1); b:= point_.create(1,1,1); b1:= point_.create(1,1,1); c:= point_.create(1,1,1); c1:= point_.create(1,1,1); d:= point_.create(1,1,1); d1:= point_.create(1,1,1); b1.x := o1.x; b.x := o1.x; b1.y := o1.y; b.y := o1.y + HH; b1.z := o1.z; b.z := o1.z; b1.h := 1; b.h := 1; c1.x := o1.x + WW; c.x := o1.x + WW; c1.y := o1.y; c.y := o1.y + HH; c1.z := o1.z; c.z := o1.z; c1.h := 1; c.h := 1; d1.x := o1.x + WW; d.x := o1.x + WW; d1.y := o1.y; d.y := o1.y + HH; d1.z := o1.z + DD; d.z := o1.z + DD; d1.h := 1; d.h := 1; a1.x := o1.x; a.x := o1.x; a1.y := o1.y; a.y := o1.y + HH; a1.z := o1.z + DD; a.z := o1.z + DD; a1.h := 1; a.h := 1; end; procedure figura.build_me(where : TImage); var centr : point_; begin where.Canvas.Pen.Width := 3; where.Canvas.Pen.Color := clBlue; a1.paint(where); a.paint(where); b1.paint(where); b.paint(where); c1.paint(where); c.paint(where); d1.paint(where); d.paint(where); centr := point_.create(1,1,1); centr.x := where.width div 2; centr.y := where.height div 2; where.Canvas.moveto(centr.x + a1.x*10 - a1.z*10, centr.y - a1.y*10 + a1.z*10); where.Canvas.lineto(centr.x + a.x*10 - a.z*10, centr.y - a.y*10 + a.z*10); where.Canvas.lineto(centr.x + d.x*10 - d.z*10, centr.y - d.y*10 + d.z*10); where.Canvas.lineto(centr.x + d1.x*10 - d1.z*10, centr.y - d1.y*10 + d1.z*10); where.Canvas.lineto(centr.x + a1.x*10 - a1.z*10, centr.y - a1.y*10 + a1.z*10); where.Canvas.lineto(centr.x + b1.x*10 - b1.z*10, centr.y - b1.y*10 + b1.z*10); where.Canvas.lineto(centr.x + c1.x*10 - c1.z*10, centr.y - c1.y*10 + c1.z*10); where.Canvas.lineto(centr.x + c.x*10 - c.z*10, centr.y - c.y*10 + c.z*10); where.Canvas.lineto(centr.x + b.x*10 - b.z*10, centr.y - b.y*10 + b.z*10); where.Canvas.lineto(centr.x + b1.x*10 - b1.z*10, centr.y - b1.y*10 + b1.z*10); where.Canvas.moveto(centr.x + a.x*10 - a.z*10, centr.y - a.y*10 + a.z*10); where.Canvas.lineto(centr.x + b.x*10 - b.z*10, centr.y - b.y*10 + b.z*10); where.Canvas.moveto(centr.x + d.x*10 - d.z*10, centr.y - d.y*10 + d.z*10); where.Canvas.lineto(centr.x + c.x*10 - c.z*10, centr.y - c.y*10 + c.z*10); where.Canvas.moveto(centr.x + d1.x*10 - d1.z*10, centr.y - d1.y*10 + d1.z*10); where.Canvas.lineto(centr.x + c1.x*10 - c1.z*10, centr.y - c1.y*10 + c1.z*10); where.Canvas.Pen.Width := 1; where.Canvas.Pen.Color := clBlack; end; procedure osi(where: TImage); var w, h:integer; step, count: integer; begin w := where.Width; h := where.Height; center_x := w div 2; center_y := h div 2; cen_x := center_x; cen_y := center_y; where.Canvas.Pen.Width := 3; where.Canvas.MoveTo(center_x, 0); where.Canvas.lineto(center_x, center_y); where.canvas.MoveTo(center_x, center_y); where.canvas.lineto(w, center_y); where.canvas.MoveTo(w-30, center_y-10); where.canvas.lineto(w, center_y); where.canvas.lineto(w-30, center_y+10); where.canvas.moveto(center_x-10, 30); where.canvas.lineto(center_x, 0); where.canvas.lineto(center_x+10, 30); if (w > h) then begin where.Canvas.MoveTo(center_x, center_y); where.canvas.LineTo(center_x - (h div 2), center_y + (h div 2)); where.canvas.LineTo(center_x - (h div 2) + 30, center_y + (h div 2) - 10); where.canvas.MoveTo(center_x - (h div 2), center_y + (h div 2)); where.canvas.LineTo(center_x - (h div 2) + 10, center_y + (h div 2) - 30); where.canvas.Pen.width := 1; ddz := 20; new_y := (center_y + (ddz div 2)); new_x := center_x - ddz; count := 2; while (new_y < h - 30) do begin where.canvas.moveto(new_x, new_y); where.canvas.lineto(new_x, new_y + ddz); where.canvas.TextOut(new_x, new_y + ddz, inttostr(count)); count := count + 2; new_x := new_x - ddz; new_y := new_y + ddz; end; end else begin where.Canvas.MoveTo(center_x, center_y); where.canvas.LineTo(center_x - (w div 2), center_y + (w div 2)); where.canvas.LineTo(center_x - (w div 2) + 30, center_y + (w div 2) - 10); where.canvas.MoveTo(center_x - (w div 2), center_y + (w div 2)); where.canvas.LineTo(center_x - (w div 2) + 10, center_y + (w div 2) - 30); where.canvas.Pen.width := 1; ddz := 20; new_y := (center_y + (ddz div 2)); new_x := center_x - ddz; count := 2; while (new_x > 30) do begin where.canvas.moveto(new_x, new_y); where.canvas.lineto(new_x, new_y + ddz); where.canvas.TextOut(new_x, new_y + ddz, inttostr(count)); count := count + 2; new_x := new_x - ddz; new_y := new_y + ddz; end; end; where.canvas.Pen.width := 1; step := center_x+20; count := 2; while (step < w - 30) do begin where.canvas.moveto(step, center_y-5); where.canvas.lineto(step, center_y+5); where.canvas.TextOut(step-5, center_y+10, inttostr(count)); count := count + 2; step := step + 20; end; step := center_y-20; count := 2; while (step > 30) do begin where.canvas.moveto(center_x-5, step); where.canvas.lineto(center_x+5, step); where.canvas.TextOut(center_x + 10, step-5, inttostr(count)); count := count + 2; step := step - 20; end; ddz := 20; end; procedure clear_field(where: TImage); begin where.canvas.Pen.color:=clWhite; where.canvas.Brush.Color := clWhite; where.canvas.Rectangle(0, 0, where.width, where.Height); where.canvas.Pen.color:=clBlack; end; function conv(t: TEdit): integer; begin Result := strtoint(t.Text); end; procedure TForm1.FormCreate(Sender: TObject); begin osi(image1); end; procedure TForm1.Exit1Click(Sender: TObject); begin close(); end; procedure TForm1.Clear1Click(Sender: TObject); begin clear_field(image1); osi(image1); end; procedure TForm1.Button1Click(Sender: TObject); begin pointer := point_.create(conv(xx),conv(yy),conv(ZZ)); figa := figura.create(pointer, conv(hh), conv(ww), conv(dd)); figa.build_me(image1); end; procedure TForm1.Button2Click(Sender: TObject); begin figa.transer(conv(a),conv(b),conv(c),conv(d),conv(e),conv(f),conv(g),conv(h),conv(i),conv(j),conv(k),conv(l),conv(m),conv(n),conv(p),conv(o)); figa.build_me(image1); end; procedure TForm1.Button3Click(Sender: TObject); begin figa.small(conv(a),conv(f),conv(k)); figa.build_me(image1); end; procedure TForm1.truvumirnujzsuv1Click(Sender: TObject); begin a.Text := '1'; b.Text := '3'; c.Text := '0'; d.Text := '0'; e.Text := '0'; f.Text := '1'; g.Text := '0'; h.Text := '0'; i.Text := '0'; j.Text := '0'; k.Text := '1'; l.Text := '0'; m.Text := '0'; n.Text := '0'; p.Text := '0'; o.Text := '1'; end; procedure TForm1.Obertna270protu1Click(Sender: TObject); begin a.Text := '0'; b.Text := '-1'; c.Text := '0'; d.Text := '0'; e.Text := '1'; f.Text := '0'; g.Text := '0'; h.Text := '0'; i.Text := '0'; j.Text := '0'; k.Text := '1'; l.Text := '0'; m.Text := '0'; n.Text := '0'; p.Text := '0'; o.Text := '1'; end; procedure TForm1.Vidobragvprostorydoxy1Click(Sender: TObject); begin a.Text := '1'; b.Text := '0'; c.Text := '0'; d.Text := '0'; e.Text := '0'; f.Text := '1'; g.Text := '0'; h.Text := '0'; i.Text := '0'; j.Text := '0'; k.Text := '-1'; l.Text := '0'; m.Text := '0'; n.Text := '0'; p.Text := '0'; o.Text := '1'; end; procedure TForm1.Prostorovuyperenospoyvkraz1Click(Sender: TObject); begin a.Text := '1'; b.Text := '0'; c.Text := '0'; d.Text := '0'; e.Text := '0'; f.Text := '1'; g.Text := '0'; h.Text := '0'; i.Text := '0'; j.Text := '0'; k.Text := '1'; l.Text := '0'; m.Text := '0'; n.Text := '3'; p.Text := '0'; o.Text := '1'; end; procedure TForm1.Obertannjanavkoloosiy1Click(Sender: TObject); begin a.Text := '0'; b.Text := '0'; c.Text := '-1'; d.Text := '0'; e.Text := '0'; f.Text := '1'; g.Text := '0'; h.Text := '0'; i.Text := '1'; j.Text := '0'; k.Text := '0'; l.Text := '0'; m.Text := '0'; n.Text := '0'; p.Text := '0'; o.Text := '1'; end; procedure TForm1.Zmenwennjapoy1Click(Sender: TObject); begin a.Text := '1'; b.Text := '0'; c.Text := '0'; d.Text := '0'; e.Text := '0'; f.Text := '3'; g.Text := '0'; h.Text := '0'; i.Text := '0'; j.Text := '0'; k.Text := '1'; l.Text := '0'; m.Text := '0'; n.Text := '0'; p.Text := '0'; o.Text := '1'; end; end. Результати виконання програми Зменшення по осі У.  Зсув по осі У.  Обертання на 270 градусів проти годинникової стрілки.  Відображення відносно осі ХУ.  Просторовий перенос по У в 3 рази  Висновок: під час виконання даної лабораторної роботи я ознайомився з основами комп‘ютерної графіки у трьовимірному перетворенні. Розробив по заданому завданню програму реалізації.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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