Розробка комплексної геометричної моделі просторового інженерного об‘єкта та її реалізація програмними засобами

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

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

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

Рік:
2024
Тип роботи:
Звіт
Предмет:
Інформаційні технології

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

Міністерство освіти і науки України Національний університет «Львівська політехніка» Інститут комп‘ютерних наук та інформаційних технологій Кафедра «Системи автоматизованого проектування» Звіт до графічно-розрахункової роботи з курсу: «Геометричне моделювання у конструюванні інженерних об‘єктів і систем» на тему: «Розробка комплексної геометричної моделі просторового інженерного об‘єкта та її реалізація програмними засобами» Львів 2008р. Національний університет “Львівська політехніка” /назва вищого учбового закладу/ Кафедра  ”Системи автоматизованого проектування” Дисципліна “Геометричне моделювання у конструюванні інженерних об’єктів та систем” Спеціальність інформаційні технології проектування Курс 4 Група КН-4 Семестр 8 Завдання на графічно-розрахункову роботу студента Дупака Богдана Петровича /прізвище, ім’я, по батькові/ 1. Тема проекту /роботи/ Розробка комплексної геометричної моделі просторового об’єкта та її реалізація програмними засобами Термін здачі студентом закінченого проекту /роботи/ 26.05.2008 Вихідні дані для проекту /роботи/ ескізне видове зображення просторового інженерного об’єкта 4. Зміст розрахунково-пояснюючої записки /перелік питань, які підлягають розробці/ Алгоритм розв’язку завдання (словесний покроковий опис чи блок-схеми). Комбінаційна модель геометричного об’єкта з графічною побудовою. Каркасна модель геометричного об’єкта з графічною побудовою. Матриця суміжності з відповідною нумерацією вершин графа та зазначенням її на графічній побудові. Матриця інцеденції з відповідною нумерацією вершин та дуг графа та зазначенням її на графічній побудові. Визначення придатної для розробки та реалізації розробленої моделі системи координат та перетворення системи координат. Математичне задання класичних кривих (окружність, еліпс, гіпербола, парабола, кардіоїда тощо), які використовуються у геометричному моделюванні. Побудувати криву Без’є на основі шести вершин багатокутника, яка описує елемент геометрії об’єкта побудови. Здійснити опис визначених колірних областей об’єкту засобами колірних моделей, здійснити перевід кольору з одної колірної моделі в іншу. Реалізувати програмно побудову кривих засобами графічних функції Windows-інтерфейса (WinAPI). Розробити алгоритм афінних перетворень геометричних елементів об’єкту та запрограмувати анімацію. Реалізувати програмно з використанням OpenGL 5. Перелік графічного матеріалу /з точним зазначенням обов’язкових креслень/ Комбінаційна модель геометричного об’єкта. Каркасна модель геометричного об’єкта. Графічні побудови кривих у визначеній системі(-ах) координат. Результати графічної програмної побудови. 6. Дата видачі завдання 11.02.2008 Календарний план № п-п Назва етапів роботи Термін виконання Етапів роботи Примітка   Ознайомитися зі засобами опису та задання моделей геометрії просторових об’єктів 11.02.2008 - 01.05.2008    Критичне опрацювання інформаційних джерел за напрямками 19.02.2008 - 13.05.2008    Критичний аналіз та обрання напрямку реалізації завдання 26.02.2008 - 30.04.2008    Виокреслення задач, розробка плану-алгоритму розробки 26.02.2008 – 28.02.2008    Побудова комбінаційної моделі геометричного об’єкта з графічною побудовою 23.04.2008 – 07.05.2008    Побудова каркасної моделі геометричного об’єкта з графічною побудовою 26.04.2008 – 13.05.2008    Побудова матриці суміжності з відповідною нумерацією вершин графа та зазначенням її на графічній побудові 26.04.2008 – 13.05.2008    Побудова матриці інцеденції з відповідною нумерацією вершин та дуг графа та зазначенням її на графічній побудові 26.04.2008 – 13.05.2008    Визначення придатної для розробки та реалізації розробленої моделі системи координат та перетворення системи координат. 01.03.2008 – 11.03.2008    Математичне задання класичних кривих (окружність, еліпс, гіпербола, парабола, кардіоїда тощо), які використовуються у геометричному моделюванні 12.03.2008 – 25.03.2008    Побудова кривої Без’є на основі шести вершин багатокутника, яка описує елемент геометрії об’єкта побудови 26.03.2008 – 09.04.2008    Опис визначених колірних областей об’єкту засобами колірних моделей, здійснення переводу кольору з одної колірної моделі в іншу. 12.02.2008 – 25.02.2008    Реалізація програмної побудови кривих засобами графічних функції Windows-інтерфейса (WinAPI). 19.03.2008 – 26.03.2008    Розробка алгоритму афінних перетворень геометричних елементів об’єкту та програмування анімації 05.03.2008 – 12.03.2008    Програмна реалізація з використанням OpenGL 01.05.2008 - 13.05.2008    Остаточне оформлення звіту до роботи 14.05.2008 - 15.05.2008    Студент Дупак Богдан Петрович /підпис/ /прізвище, ім’я, по батькові/ Керівник Маркелов Олександр Едуардович /підпис/ /прізвище, ім’я, по батькові/ “ 26 ” травня 2008 р. Графічні можливості мови Turbo Pascal версії 7.0 Побудувати програму заповнення екрану випадковими лініями. program lab1; uses graph, crt; const Solidln=0; Dottedlln=1; Centerln=2; Dashedln=3; UserBitln=4; var grDriver: Integer; grMode: Integer; ErrCode: Integer; x1,x2,x3,x4,x5,x6,x7: integer; begin grDriver := Detect; InitGraph(grDriver, grMode,'c:\tp71\bgi'); {Initsializye grafichnuu rezhum} ErrCode := GraphResult; if ErrCode = grOk then begin { Do graphics } randomize; repeat x1:=random(640)+1; x2:=random(480)+1; X3:=random(640)+1; x4:=random(480)+1; x5:=random(3)+1; x6:=random(4)+1; x7:=random(15)+1; setcolor(x7); {Xaotuchno zadae kolir linii} SetLineStyle(x6,0,x5); {Xaotuchno zadae stul linii} line(x1,x2,x3,x4); {Xaotuchno malyue liniyu} until keypressed; CloseGraph; end else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); end. Афінні перетворення та анімація засобами мови Turbo Pascal версії 7.0 Написати імітаційну програму із застосуванням афінних перетворень, яка дозволяє в автоматичному та при ручному керуванні створювати динамічно змінну візуалізацію, при якій моделюється процес випару суміші трьох рідин із різною температурою кипіння.  ТЕКСТ ПРОГРАМИ Program lab2_gr; Uses Crt, Graph; Type coord=record x,y:integer end; zv=^pointer; pointer=record cord:coord; col:word; prev:zv; next:zv end; Label l1; Var driver,mode,maxX,maxY,i,x,y,k,la2,la3:integer; cords:array[1..10] of coord; ozn1,ozn2,ozn3,choise:byte; vbaz,vcur,vlast:zv; colbuf,kol:word; ch:char; str:string; Procedure setcoords; Begin cords[1].x:=0; cords[1].y:=200; cords[2].x:=100; cords[2].y:=190; cords[3].x:=150; cords[3].y:=205; cords[4].x:=220; cords[4].y:=195; cords[5].x:=300; cords[5].y:=180; cords[6].x:=410; cords[6].y:=195; cords[7].x:=550; cords[7].y:=205; cords[8].x:=580; cords[8].y:=220; cords[9].x:=600; cords[9].y:=170; cords[10].x:=639; cords[10].y:=200; End; Procedure fon; Var ifon:integer; Begin setcolor(colbuf); if ozn1<>0 then begin moveto(0,250); for ifon:=1 to 10 do lineto(cords[ifon].x,cords[ifon].y); lineto(maxX,250); lineto(0,250); setfillstyle(10,14); floodfill(10,240,colbuf) end; if ozn2<>0 then begin rectangle(0,la2,639,300); setfillstyle(10,12); floodfill(10,275,colbuf) end; if ozn3<>0 then begin rectangle(0,la3,maxX,maxY); setfillstyle(10,13); floodfill(10,maxY-2,colbuf) end End; Procedure delbuble; Begin if vbaz<>nil then begin vcur:=vbaz; vbaz:=vbaz^.next; vbaz^.prev:=nil; vcur^.next:=nil; dispose(vcur) end End; Procedure addbuble(adx,ady:integer;adkol:word); Begin if vbaz=nil then begin new(vbaz); vbaz^.prev:=nil; vbaz^.next:=nil; vbaz^.cord.x:=adx; vbaz^.cord.y:=ady; vbaz^.col:=adkol end else begin vcur:=vbaz; while vcur^.next<>nil do vcur:=vcur^.next; new(vcur^.next); vcur^.next^.prev:=vcur; vcur:=vcur^.next; vcur^.next:=nil; vcur^.cord.x:=adx; vcur^.cord.y:=ady; vcur^.col:=adkol; vlast:=vcur end End; Procedure buble(ibub:integer); Var j:integer; Begin if ibub=1 then for j:=1 to ozn1 do begin x:=random(maxX); y:=185+random(55); kol:=14; addbuble(x,y,kol) end; if ibub=2 then for j:=1 to ozn2 do begin x:=random(maxX); y:=260+random(30); kol:=12; addbuble(x,y,kol) end; if ibub=3 then for j:=1 to ozn3 do begin x:=random(maxX); y:=maxY-random(39); kol:=13; addbuble(x,y,kol) end End; Procedure bubles; Var bx,by:integer; Begin vcur:=vbaz; while vcur<>nil do begin bx:=vcur^.cord.x; by:=vcur^.cord.y; setcolor(vcur^.col); circle(bx,by,4); vcur:=vcur^.next end; setcolor(colbuf) End; Procedure analyze; Label 1; Begin 1: while vbaz^.cord.y=0 do delbuble; vcur:=vbaz^.next; while vcur^.next<>nil do begin if vcur^.cord.y=0 then begin if vcur^.next<>nil then vcur^.next^.prev:=vcur^.prev; vcur^.prev^.next:=vcur^.next; dispose(vcur); goto 1 end; vcur:=vcur^.next end End; Procedure adcordbu(speed:integer); Begin { while vbaz^.cord.y<=1 do delbuble;} vcur:=vbaz; while vcur<>nil do begin vcur^.cord.y:=vcur^.cord.y-speed; vcur:=vcur^.next end; { analyze} End; Begin l1: writeln('Enter your chosie:'); writeln('1-Manual animation;'); writeln('2-Automatic animation.'); readln(str); if str='1' then choise:=1 else if str='2' then choise:=2 else choise:=0; if (choise<>1) and (choise<>2) then begin writeln('WRONG choise!!!'); goto l1 end; driver:=3; mode:=1; InitGraph(driver,mode,''); maxX:=GetMaxX; maxY:=GetMaxY; colbuf:=10; setcoords; la2:=250; la3:=300; ozn1:=1; ozn2:=1; ozn3:=1; vbaz:=nil; vcur:=nil; Randomize; for i:=1 to 100 do begin if (i div 5)=ozn1 then ozn1:=ozn1+1; if (i div 40)=ozn2 then ozn2:=ozn2+1; if (i div 40)=ozn3 then ozn3:=ozn3+1; if (i mod 3 = 0) and (ozn1<>0) then for k:=1 to 10 do cords[k].y:=cords[k].y+1; if (ozn1=0) and (ozn2<>0) then la2:=la2+1; if (i mod 2=0) and (ozn2=0) then la3:=la3+3; if i>50 then begin ozn1:=0; ozn2:=ozn2+2; ozn3:=ozn3+0 end; if i>75 then begin ozn2:=0; ozn3:=ozn3+2 end; if ozn1<>0 then buble(1); if ozn2<>0 then buble(2); if ozn3<>0 then buble(3); fon; bubles; adcordbu(1); if choise=1 then ch:=readkey; if ch='a' then choise:=2; if choise=2 then delay(100); ClearViewPort end; addbuble(maxX,maxY,13); while {vbaz^.cord.y>=30} vlast^.cord.y>=1 do begin bubles; adcordbu(3); delay(5); ClearViewPort end; moveto(trunc(maxX/2),trunc(maxY/2)); setcolor(white); outtext('The End.'); moverel(-100,15); outtext('(Press any key to exit)'); readkey; closegraph; End. Графічна функції Windows-інтерфейса (WinAPI). Засобами Borland Pascal 7.0 for Windows та Borland Delphi  Текст програми unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Buttons; type TForm1 = class(TForm) Image1: TImage; TrackBar1: TTrackBar; Label1: TLabel; Label2: TLabel; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; BitBtn1: TBitBtn; BitBtn2: TBitBtn; Label3: TLabel; TrackBar2: TTrackBar; Label4: TLabel; CheckBox2: TCheckBox; ComboBox1: TComboBox; ComboBox2: TComboBox; Label5: TLabel; Label6: TLabel; ComboBox3: TComboBox; procedure BitBtn2Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Label4Click(Sender: TObject); procedure TrackBar2Change(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure ComboBox2Change(Sender: TObject); procedure ComboBox3Change(Sender: TObject); procedure Label5Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; k,f,x,y,rx,ry,kd,fd:integer; colGr1,colGr2,colAx:TColor; implementation {$R *.dfm} Procedure FonDraw; Begin Form1.Image1.Canvas.FillRect(Rect(0,0,Form1.Image1.Width,Form1.Image1.Height)); End; Procedure DrawAxes; Begin k:=Form1.TrackBar1.Position; Form1.Image1.Canvas.Pen.Color:=colAx; Form1.Image1.Canvas.MoveTo(0,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.LineTo(Form1.Image1.Width,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.MoveTo(Trunc(Form1.Image1.Width/2),0); Form1.Image1.Canvas.LineTo(Trunc(Form1.Image1.Width/2),Form1.Image1.Height); Form1.Image1.Canvas.Pen.Color:=clSilver; x:=Trunc(Form1.Image1.Width/2); while x<Form1.Image1.Width do begin x:=x+k; Form1.Image1.Canvas.MoveTo(x,0); Form1.Image1.Canvas.LineTo(x,Form1.Image1.Height); end; x:=Trunc(Form1.Image1.Width/2); while x>0 do begin x:=x-k; Form1.Image1.Canvas.MoveTo(x,0); Form1.Image1.Canvas.LineTo(x,Form1.Image1.Height); end; y:=Trunc(Form1.Image1.Height/2); while y<Form1.Image1.Height do begin y:=y+k; Form1.Image1.Canvas.MoveTo(0,y); Form1.Image1.Canvas.LineTo(Form1.Image1.Width,y); end; y:=Trunc(Form1.Image1.Height/2); while y>0 do begin y:=y-k; Form1.Image1.Canvas.MoveTo(0,y); Form1.Image1.Canvas.LineTo(Form1.Image1.Width,y); end; End; Function fy1(fx:integer):real; Begin fy1:=(sqr(fx)-1)/(sqr(sqr(fx))+1) End; Function fy2(fx:integer):real; Begin fy2:=-sqr(sqr(fx))*fx+2*sqr(fx)*fx-1; End; Function fy1D(fxD:real):real; Begin fy1D:=(sqr(fxD)-1)/(sqr(sqr(fxD))+1) End; Function fy2D(fxD:real):real; Begin fy2D:=-sqr(sqr(fxD))*fxD+2*sqr(fxD)*fxD-1; End; Procedure Grafic(pg:integer); Begin if pg=1 then begin FonDraw; DrawAxes end else if pg=2 then begin Form1.Image1.Canvas.Pen.Color:=colGr1; rx:=0; ry:=Trunc(fy1(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.MoveTo(x,y); while x<Form1.Image1.Width do begin rx:=rx+1; ry:=Trunc(fy1(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.LineTo(x,y); end; rx:=0; ry:=Trunc(fy1(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.MoveTo(x,y); while x>0 do begin rx:=rx-1; ry:=Trunc(fy1(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.LineTo(x,y); end end else if pg=3 then begin Form1.Image1.Canvas.Pen.Color:=colGr2; rx:=0; ry:=Trunc(fy2(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.MoveTo(x,y); while x<Form1.Image1.Width do begin rx:=rx+1; ry:=Trunc(fy2(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.LineTo(x,y); end; rx:=0; ry:=Trunc(fy2(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.MoveTo(x,y); while x>0 do begin rx:=rx-1; ry:=Trunc(fy2(rx)); x:=Trunc(Form1.Image1.Width/2)+k*rx; y:=Trunc(Form1.Image1.Height/2)-k*ry; Form1.Image1.Canvas.LineTo(x,y); end end End; Procedure func; Begin if Form1.RadioButton1.Checked then f:=1 else if Form1.RadioButton2.Checked then f:=2 else if Form1.RadioButton3.Checked then f:=3 else if Form1.RadioButton4.Checked then f:=4; case f of 1:Grafic(1); 2:Grafic(2); 3:Grafic(3); 4:Begin Grafic(2); Grafic(3) end end; End; Procedure GraficD(pgD:integer); Var dx,dy,krok:real; Begin if pgD=2 then begin Form1.Image1.Canvas.Pen.Color:=colGr1; krok:=1/(10*kd); dx:=0; x:=Trunc(Form1.Image1.Width/2); dy:=fy1D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.MoveTo(x,y); while x<Form1.Image1.Width do begin dx:=dx+krok; x:=x+1; dy:=fy1D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.LineTo(x,y); end; dx:=0; x:=Trunc(Form1.Image1.Width/2); dy:=fy1D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.MoveTo(x,y); while x>0 do begin dx:=dx-krok; x:=x-1; dy:=fy1D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.LineTo(x,y); end; end else if pgD=3 then begin Form1.Image1.Canvas.Pen.Color:=colGr2; krok:=1/(10*kd); dx:=0; x:=Trunc(Form1.Image1.Width/2); dy:=fy2D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.MoveTo(x,y); while x<Form1.Image1.Width do begin dx:=dx+krok; x:=x+1; dy:=fy2D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.LineTo(x,y); end; dx:=0; x:=Trunc(Form1.Image1.Width/2); dy:=fy2D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.MoveTo(x,y); while x>0 do begin dx:=dx-krok; x:=x-1; dy:=fy2D(dx); y:=Trunc(Form1.Image1.Height/2-dy*(kd*10)); Form1.Image1.Canvas.LineTo(x,y); end; end End; Procedure DrawAxesD; Var DADi:integer; Begin Form1.Image1.Canvas.Pen.Color:=colAx; Form1.Image1.Canvas.MoveTo(0,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.LineTo(Form1.Image1.Width,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.MoveTo(Trunc(Form1.Image1.Width/2),0); Form1.Image1.Canvas.LineTo(Trunc(Form1.Image1.Width/2),Form1.Image1.Height); Form1.Image1.Canvas.MoveTo(Form1.Image1.Width,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.LineTo(Form1.Image1.Width-10,Trunc(Form1.Image1.Height/2)-6); Form1.Image1.Canvas.MoveTo(Form1.Image1.Width,Trunc(Form1.Image1.Height/2)); Form1.Image1.Canvas.LineTo(Form1.Image1.Width-10,Trunc(Form1.Image1.Height/2)+6); Form1.Image1.Canvas.MoveTo(Trunc(Form1.Image1.Width/2),0); Form1.Image1.Canvas.LineTo(Trunc(Form1.Image1.Width/2)-6,10); Form1.Image1.Canvas.MoveTo(Trunc(Form1.Image1.Width/2),0); Form1.Image1.Canvas.LineTo(Trunc(Form1.Image1.Width/2)+6,10); Form1.Image1.Canvas.Pen.Color:=clSilver; x:=Trunc(Form1.Image1.Width/2); DADi:=0;
Антиботан аватар за замовчуванням

02.10.2020 20:10-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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