Міністерство освіти і науки України
Національний університет “Львівська Політехніка”
кафедра САПР
Звіт
до лабораторної роботи № 2
по темі: “ Афінні перетворення та анімація засобами мови Turbo Pascal версії 7.0”
з курсу “ Геометричне моделювання у конструюванні інженерних об’єктів і систем”
1. МЕТА РОБОТИ
Ознайомитись із законами руху геометричних об(єктів на площині та у просторі. Оволодіти математичною мовою опису динаміки та візуалізації на основі закономірностей геометричних перетворень. Набути практичних навиків розробки графічних процедур у середовищі Turbo Pascal в графічному режимі.
2. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ.
Елементарні афінні перетворення:
перенос;
масштабуваня;
зсув;
поворот (обертання);
Процедура setcolor(<колір>), де <колір> – змінна типу word, яка задає колір. У модулі Graph є такі константи для задання кольору:
Black=0; {чорний}
Blue=1; {синій}
Green=2; {зелений}
Gray=3; {голубий}
Red=4; {червоний}
Magenta=5; {фіолетовий}
Brown=6; {коричневий}
LightGrey=7; {світло-сірий}
DarkGrey=8; {темно-сірий}
LightBlue=9; {яскраво-синій}
LightGreen=10; {яскраво-зелений}
LightCyan=11; {яскраво-голубий}
LightRed=12; {рожевий}
LightMagenta=13; {малиновий}
Yellow=14; {жовтий}
White=15; {білий}
MoveTo(x,y) — встановлює невидимий графічний курсор у точку із координатами (x,y).
LineTo(x,y) — проводить лінію із точки, в яку встановлено невидимий графічний курсор у точку із координатами (x,y).
SetFillStyle(<штриховка>,<колір>) — встановлює стиль (тип і колір) штриховки.
FloodFill(x,y,<колір контура>) — заштриховує замкнутий контур, x,y– координати точки всередині замкнутого контура, <колір контура> — колір лінії, яка формує замкнутий контур.
Rectangle(x1,y1,x2,y2) — малює прямокутник за координатами точок відрізка – головної діагоналі.
InitGraph(<драйвер>,<режим>,’<шлях до файлу *.BGI відповідного драйвера>’). Драйвери, наприклад: EGA, VGA, IBM8514 …, для кожного із яких існує свій відповідний номер, наприклад для VGA – 9, який потрібно ввести на місце першого параметра процедури ініціалізації графічного режиму InitGraph.
Лабораторне завдання.
Ознайомитись із графічними командами мови Turbo Pascal.
Створити алгоритм розв(язку індивідуального завдання.
Скласти програму на мові Паскаль, набрати у текстовому редакторі інтегрованого середовища.
Записати створену програму на диск.
Запустити на виконання програму.
Отримати результати виконання програми згідно індивідуального завдання.
Здійснити аналіз результатів та сформулювати висновки по роботі.
Оформити звіт про роботу.
Варіант індивідуального завдання №3.
Написати імітаційну програму із застосуванням афінних перетворень, яка дозволяє в автоматичному та при ручному керуванні створювати динамічно змінну візуалізацію, при якій моделюється процес випару суміші трьох рідин із різною температурою кипіння.
ТЕКСТ ПРОГРАМИ
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.
Висновок: виконавши лабораторну роботу, я ознайомився із законами руху геометричних об(єктів на площині та у просторі, із математичною мовою опису динаміки та візуалізації на основі закономірностей геометричних перетворень, набув практичних навиків розробки графічних процедур у середовищі Turbo Pascal у графічному режимі, а також ознайомився і набув практичних навиків анімування зображень.