Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Інститут комп‘ютерних наук та інформаційних технологій
Кафедра «Системи автоматизованого проектування»
Звіт
до графічно-розрахункової роботи
з курсу: «Геометричне моделювання у конструюванні інженерних об‘єктів і систем»
на тему:
«Розробка комплексної геометричної моделі просторового інженерного об‘єкта
та її реалізація програмними засобами»
Львів 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;