МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ПОБУДОВА РУХОМИХ ЗОБРАЖЕНЬ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 4
З КУРСУ “КОМП’ЮТЕРНА ГРАФІКА”
ПОВНИЙ ТЕКСТ ЗАВДАННЯ
1. Вивчити основні матричні перетворення на площині для побудови рухомих зображень.
2. Вивести результуючу матрицю руху для свого варіанту завдання, визначеного викладачем. Параметри зображення задані в таблиці 1 в пікселах.
3. Написати програму мовою Турбо-Паскаль, що дозволяє сформувати на екрані комп’ютера рухоме зображення.
Таблиця 1.
№
варіанту
Структура зображення
Пояснення
11
Рух квадрата по видимому квадратному контуру за годинниковою стрілкою. В кожній вершині контура квадрат повертається на 90 градусів. Кольори контура і квадрата різні.
Параметри : a=20, A=80
ОСТАТОЧНА ВЕРСІЯ БЛОК-СХЕМИ АЛГОРИТМУ
Процедура NCORNERBUILDER
ні
так
Процедура R2Move
1
2
ні
4
так
3
5
6
так ні
7
так ні
8
9
10
так ні
11
так ні
12
13
14
15
16
17
18
ні
19
так
20
21
22
23
24
Процедура R2ShapeRotator
1
2
3
4 ні
так
5
6
7
ні
так 8
9
10
11
12
13
14
15
ні
так 16
17
18
19
20
21
22
23
Процедура R2Shape
1
2
3
4
5
6
7
8
9
10
11
12
13
1 14
15
16
17
18
Головна програма
1
2
3
4
5
6
7
ні так
8
9
10
11
12
13
14
ні
15
так
16
17
18
19
20
21
22
23
24
25
26
27
ні
так
28
29
30
ні
так 31
32
33
СПИСОК ІДЕНТИФІКАТОРІВ КОНСТАНТ, ЗМІННИХ, ПРОЦЕДУР ТА ФУНКЦІЙ, ВИКОРИСТАНИХ У БЛОК-СХЕМІ АЛГОРИТМУ І ПРОГРАМИ, ТА ЇХ ПОЯСНЕННЯ
СПИСОК :
Q
R1
R2
N
DRIVER
MODE
I
K
W
P
FLOODPOINTX
FLOODPOINTY
PIX
MAS
POINT
X0
Y0
DX0
DY0
X
Y
F
FW
DQ
DDQ
XC
YC
BUFX
BUFY
MOVEX
MOVEY
XW
YW
X1
Y1
X2
Y2
X3
Y3
MOVETYPE1
MOVETYPE2
SWITCH1
SWITCH2
ПОЯСНЕННЯ ІДЕНТИФІКАТОРІВ ЗМІННИХ :
Q – кут повороту
R1 – радіус кола, описаного навколо 1 квадрата
R2 – радіус кола, описаного навколо 2 квадрата
N – кількість сторін многокутника
Driver – тип графічного адаптера
Mode – режим роботи адаптера
I – лічильник
K – лічильник
W - лічильник
P – лічильник
Floodpointx – координата по осі абсцис точки для заливки об’єкта
Floodpointy – координата по осі ординат точки для заливки об’єкта
Pix – кількість пройдених проміжків об’єктом під час руху
Mas – лічильник
Point - номер точки повороту
X0 – абсциса центру квадрата
Y0 – ордината центру квадрата
Dx0 – переміщення по осі абсцис
Dy0 – преміщення по осі ординат
X – абсциса реперної точки
Y – ордината реперної точки
F – кут між реперними точками
FW – кут повороту фігури при побудові
Dq – крок кута повороту
Ddq – кут повороту
Xc – абсциса точки повороту
Yc – ордината точки повороту
Bufx – абсциса положення центру фігури після повороту
Bufy – ордината положення центру фігури після повороту
Movex – абсциса положення центру фігури під час руху
Movey – ордината положення центру фігури під час руху
Xw – проміжний масив абсцис реперних точок
Yw – проміжний масив ординат реперних точок
X1 – масив абсцис реперних точок 1 квадрата
Y1 – масив ординат реперних точок 1 квадрата
X2 – масив абсцис реперних точок 2 квадрата
Y2 – масив ординат реперних точок 2 квадрата
X3 – масив абсцис реперних точок для графічної побудови квадрата
Y3 – масив ординат реперних точок для графічної побудови квадрата
Movetype1 – рух вверх або вперед
Movetype2 – рух вниз або назад
Switch1 – 1 тип руху для комбінацій Movetype1
Switch2 – 2 тип руху для комбінацій Movetype2
ПОЯСНЕННЯ ПРОЦЕДУР ТА ФУНКЦІЙ :
INITGRAPH – ініціалізує графічний режим
GRAPHRESULT – тестує роботу графічного режиму
SETFILLSTYLE – задає тип та колір штрихування
FLOODFILL – штрихує замкнену фігуру за точкою що знаходиться в ній та заданим кольором границі
Lineto – проводить лінію з поточного положення курсора в точку (x,y)
Delay – затримка
Clrscr – очистка текстового екрану
ClearDevice – очистка графічного екрану
CloseGraph – закриття графічного режиму
Moveto – переміщення курсора у вказану точку
Setcolor – задання кольору
ОСТАТОЧНА ВЕРСІЯ ПРОГРАМИ
Program Lab_4_11;
uses crt,graph;
const Q=pi/2;
R1=(40/sin((45/180)*pi));
R2=(10/sin((45/180)*pi));
N=4;
type massiv=array [1..4] of real;
var
driver,mode,i,k,w,p,floodpointx,floodpointy,pix,mas,point:integer;
x0,y0,dx0,dy0,x,y,f,fw,dq,ddq,xc,yc,bufx,bufy,movex,movey:real;
xw,yw,x1,y1,x2,y2,x3,y3:massiv;
Movetype1,Movetype2,switch1,switch2:boolean;
procedure nCornerBuilder(n:integer;R:real;fw:real;x0:real;y0:real);
begin
f:=fw;
y:=sin(f)*R+y0;
x:=cos(f)*R+x0;
moveto(round(x),round(y));
f:=2*pi/n+fw;
i:=1;
while(f<=2*pi+fw)
do
begin
y:=sin(f)*R+y0;
x:=cos(f)*R+x0;
xw[i]:=(x);
yw[i]:=(y);
lineto(round(x),round(y));
f:=f+2*pi/n;
i:=i+1;
end;
end;
procedure R2Shape(x1:massiv;x2:massiv;y1:massiv;y2:massiv);
procedure R2Move(pix:integer;Movetype1:boolean;Movetype:boolean;switch1:boolean;switch2:boolean);
begin
for w:=1 to pix
do
begin
cleardevice;
fw:=pi/4;
if(switch1)
then
if(Movetype1)
then
movey:=movey-5
else
movex:=movex+5;
if(switch2)
then
if(Movetype2)
then
movey:=movey+5
else
movex:=movex-5;
y0:=movey;
x0:=movex;
setcolor(green);
Ncornerbuilder(n,R2,fw,x0,y0);
setfillstyle(1,green);
floodfill(trunc(movex),trunc(movey),green);
for mas:=1 to n do
begin
x2[mas]:=xw[mas];
y2[mas]:=yw[mas];
end;
x0:=(Getmaxx/2);
y0:=(Getmaxy/2);
fw:=pi/4;
setcolor(blue);
Ncornerbuilder(n,R1,fw,x0,y0);
delay(150);
end;
end;
procedure R2ShapeRotator(point:integer);
begin
xc:=x1[point];
yc:=y1[point];
dq:=q/10;
ddq:=0;
for p:=1 to 10
do
begin
ddq:=ddq+dq;
cleardevice;
for k:=1 to n
do
begin
xw[k]:=x2[k]*cos(ddq)-y2[k]*sin(ddq)+xc*(1-cos(ddq))+yc*sin(ddq);
yw[k]:=x2[k]*sin(ddq)+y2[k]*cos(ddq)+yc*(1-cos(ddq))-xc*sin(ddq);
x3[k]:=xw[k];
y3[k]:=yw[k];
end;
x0:=Getmaxx/2;
y0:=Getmaxy/2;
fw:=pi/4;
setcolor(blue);
Ncornerbuilder(n,R1,fw,x0,y0);
delay(100);
setcolor(green);
moveto(round(x3[1]),round(y3[1]));
for w:=1 to n
do
lineto(round(x3[w]),round(y3[w]));
lineto(round(x3[1]),round(y3[1]));
setfillstyle(solidfill,green);
floodpointx:=round((x3[2]+x3[4])/2);
floodpointy:=round((y3[2]+y3[4])/2);
floodfill(floodpointx,floodpointy,green);
delay(100);
end;
bufx:=movex*cos(q)-movey*sin(q)+xc*(1-cos(q))+yc*sin(q);
bufy:=movex*sin(q)+movey*cos(q)+yc*(1-cos(q))-xc*sin(q);
movex:=bufx;
movey:=bufy;
end;
begin
{move part 1}
pix:=2;
switch1:=true;
switch2:=false;
movetype1:=true;
R2Move(pix,Movetype1,Movetype2,switch1,switch2);
point:=2;
R2ShapeRotator(point);
{move part 2}
pix:=16;
switch1:=true;
switch2:=false;
movetype1:=false;
R2Move(pix,Movetype1,Movetype2,switch1,switch2);
point:=3;
R2ShapeRotator(point);
{move part 3}
pix:=16;
switch1:=false;
switch2:=true;
movetype2:=true;
R2Move(pix,Movetype1,Movetype2,switch1,switch2);
point:=4;
R2ShapeRotator(point);
{move part 4}
pix:=16;
switch1:=false;
switch2:=true;
movetype2:=false;
R2Move(pix,Movetype1,Movetype2,switch1,switch2);
point:=1;
R2ShapeRotator(point);
{move part 5}
pix:=14;
switch1:=true;
switch2:=false;
movetype1:=true;
R2Move(pix,Movetype1,Movetype2,switch1,switch2);
end;
begin
clrscr;
driver:=15;
mode:=4;
initgraph(driver,mode,'C:\Program Files\Free Pascal\Bin\Win32\SVGA256.bgi');
if graphresult <> 0 then begin
writeln('Џа®Ў«Ґ¬ § ®Ў« ¤ п¬ Ў® ўi¤бгвi© Ја дiзЁ© ¤а ©ўҐа.Iiжi «i§ жiп Ґ¬®¦«Ёў ');
halt
end;
x0:=Getmaxx/2;
y0:=Getmaxy/2;
fw:=pi/4;
Ncornerbuilder(n,R1,fw,x0,y0);
for i:=1 to n do
begin
x1[i]:=xw[i];
y1[i]:=yw[i];
end;
fw:=pi/4;
ncornerbuilder(n,R2,fw,x0,y0);
for i:=1 to n do
begin
x2[i]:=xw[i];
y2[i]:=yw[i];
end;
{Moving parameters}
dx0:=x1[2]-x2[3];
dy0:=y1[2]-y2[3];
{Moving parameters}
{Moving to start pozition}
cleardevice;
x0:=(Getmaxx/2);
y0:=(Getmaxy/2);
fw:=pi/4;
setcolor(blue);
Ncornerbuilder(n,R1,fw,x0,y0);
x0:=(x0+dx0);
y0:=(y0+dy0);
movey:=y0;
movex:=x0;
fw:=pi/4;
setcolor(green);
Ncornerbuilder(n,R2,fw,x0,y0);
setfillstyle(1,green);
floodfill(trunc(x0),trunc(y0),green);
{Moving to starting pozition}
{Writing coordinates to massive}
for i:=1 to n do
begin
x2[i]:=xw[i];
y2[i]:=yw[i];
end;
{Writing coordinates to massive}
{Shape R1 rotating}
delay(1400);
while(not(keypressed))
do
begin
R2shape(x1,x2,y1,y2);
end;
readln;
closegraph;
end.
РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ