Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра «Захисту інформації»
Розрахункова робота
З курсу:
“Копм’ютерна графіка”
Варіант: 18
№ варіанту
Функція f(x)
Діапазон зміни аргументу
18
z=arcctg(x)
[-1000; 1000]
№ варіанту
Структура зображення
Пояснення
18
Хрест безперервно котиться по горизонтальній. При досягненні стінок напрямок кочення змінюється на протилежний.
Код програми:
Program rozrah;
Uses Graph, CRT;
var xmax, ymax, px0, py0: integer;
kx, ky, x0, y0:real;
alpha1,n,xn,yn,kr,xh,yh,xc,yc,r,alpha,startx,endx,xs,ys:extended;
const delta:integer = 50;
ws_delta:integer = 10;
a:integer = 150;
b:integer = 90;
d:integer = 25;
cur_x:integer = 9;
cur_y:integer = 5;
cur_p:integer = 8;
np_x:integer = 10;
np_y:integer = 7;
c_xa:integer = -1000;
c_xb:integer = 1000;
Procedure ramka;
Begin
line((GetMaxX div 2)+10, GetMaxY-1, (GetMaxX div 2)+172, GetMaxY-1);
line((GetMaxX div 2)+10, GetMaxY-1, (GetMaxX div 2)+10, GetMaxY-20);
line((GetMaxX div 2)+172, GetMaxY-1, (GetMaxX div 2)+172, GetMaxY-20);
end;
Procedure hrest(xh,yh:integer; alpha:extended);
var r,rm,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12:extended;
alpha1,alpha2,alpha3,alpha4,alpha5,alpha6,alpha7,alpha8,alpha9,alpha10,alpha11,alpha12:extended;
Begin
setlinestyle(0,1,1); setcolor(15); ramka; alpha:=alpha*pi/180; r:=16; rm:=8;
alpha1:=(alpha+22)*pi/180; alpha2:=(alpha+45)*pi/180; alpha3:=(alpha+67)*pi/180;
alpha4:=(alpha+112)*pi/180; alpha5:=(alpha+135)*pi/180; alpha6:=(alpha+157)*pi/180;
alpha7:=(alpha+202)*pi/180; alpha8:=(alpha+225)*pi/180; alpha9:=(alpha+247)*pi/180;
alpha10:=(alpha+292)*pi/180; alpha11:=(alpha+315)*pi/180; alpha12:=(alpha+337)*pi/180;
x1:=r*cos(alpha1)+xh; y1:=r*sin(alpha1)+yh; x2:=rm*cos(alpha2)+xh; y2:=rm*sin(alpha2)+yh;
x3:=r*cos(alpha3)+xh; y3:=r*sin(alpha3)+yh; x4:=r*cos(alpha4)+xh; y4:=r*sin(alpha4)+yh;
x5:=rm*cos(alpha5)+xh; y5:=rm*sin(alpha5)+yh; x6:=r*cos(alpha6)+xh; y6:=r*sin(alpha6)+yh;
x7:=r*cos(alpha7)+xh; y7:=r*sin(alpha7)+yh; x8:=rm*cos(alpha8)+xh; y8:=rm*sin(alpha8)+yh;
x9:=r*cos(alpha9)+xh; y9:=r*sin(alpha9)+yh; x10:=r*cos(alpha10)+xh; y10:=r*sin(alpha10)+yh;
x11:=rm*cos(alpha11)+xh; y11:=rm*sin(alpha11)+yh; x12:=r*cos(alpha12)+xh; y12:=r*sin(alpha12)+yh;
line(trunc(x1),trunc(y1),trunc(x2),trunc(y2)); line(trunc(x2),trunc(y2),trunc(x3),trunc(y3));
line(trunc(x3),trunc(y3),trunc(x4),trunc(y4)); line(trunc(x4),trunc(y4),trunc(x5),trunc(y5));
line(trunc(x5),trunc(y5),trunc(x6),trunc(y6)); line(trunc(x6),trunc(y6),trunc(x7),trunc(y7));
line(trunc(x7),trunc(y7),trunc(x8),trunc(y8)); line(trunc(x8),trunc(y8),trunc(x9),trunc(y9));
line(trunc(x9),trunc(y9),trunc(x10),trunc(y10); line(trunc(x10),trunc(y10),trunc(x11),trunc(y11));
line(trunc(x11),trunc(y11),trunc(x12),trunc(y12)); line(trunc(x12),trunc(y12),trunc(x1),trunc(y1));
end;
procedure InitGrp;
var r,d:integer;
begin
d:=detect;
InitGraph(d, r, 'bgi');
r:=GraphResult;
if r<>grok then
begin
Writeln (GraphErrorMsg(r)); readln; Halt(1);
end;
setfillstyle(1,15);
end;
function GetY(x:real) : real;
begin
GetY:=arctan(x);
end;
procedure GetMinMaxY(var min:real; var max:real; ax:real; bx:real);
var h,y,x:real;
begin
h:=(bx-ax)/(GetMaxX-2*delta); min:=1e23; max:=-1e23; x:=ax; while (x<=bx) do
begin
y:=GetY(x); if(y>max) then max:=y; if(y<min) then min:=y; x:=x+h;
end;
end;
function ToX(x:real):integer;
var ret:real;
begin
ret:=round(GetMaxX/2) + (x)*kx;
ToX:=round(ret);
end;
function ToY(y:real):integer;
var ret:real;
begin
ret:=py0 + (y0-y)*ky;
ToY:=round(ret);
end;
procedure PaintXY(ax:real; bx:real);
var fmin, fmax, gx_min, gx_max, gy_min, gy_max, t:real;
x,y,i:integer;
s:string[50];
begin
gx_min:=ax; gx_max:=bx; if(bx<0) then begin gx_max:=0; end
else if(ax>0) then gx_min:=0;
GetMinMaxY(gy_min, gy_max, ax, bx);
if(gy_max<0) then begin gy_max:=0; end
else if(gy_min>0) then gy_min:=0;
if((kx=0) or (ky=0)) then
begin
kx:=(GetMaxX-2*delta)/(gx_max-gx_min); ky:=(GetMaxY-2*delta)/(gy_max-gy_min);
x0:=gx_min; y0:=gy_min; px0:=delta; py0:=GetMaxY-delta;
end;
SetColor(7); SetLineStyle(0,0,0); SetTextStyle(SansSerifFont,0,0);
y:=ToY(0); Line(px0, y, GetMaxX-delta, y); MoveTo(GetMaxX-delta, y); LineRel(-cur_x,-cur_y);
MoveRel(cur_x, cur_y); LineRel(-cur_x, cur_y); t:=(gx_max-gx_min)/np_x;
for i:=1 to np_x-1 do
begin
x:=ToX(gx_min+t*i); MoveTo(x,round(y+cur_p/2));
LineRel(0,-cur_p); str(gx_min+t*i:0:0, s); OutTextXY(x-3, y+cur_p, s);
end;
OutTextXY(GetMaxX-delta, y+10, 'X'); x:=ToX(0); Line(x, py0, x, delta);
MoveTo(x, delta); LineRel(cur_y,cur_x); MoveRel(-cur_y, -cur_x);
LineRel(-cur_y, cur_x); t:=(gy_max-gy_min)/np_y;
for i:=1 to np_y-1 do
begin
y:=ToY(gy_min+t*i); MoveTo(round(x-cur_p/2), y); LineRel(cur_p, 0);
if(gy_max-gy_min>100) then
begin
str(gy_min+t*i:0, s); OutTextXY(round(x+cur_p/2), y-3, s);
end else
begin
str(gy_min+t*i:3:1, s); OutTextXY(round(x+cur_p/2), y-3, s);
end;
end;
OutTextXY(x+10, delta, 'Y');
end;
procedure PaintGraph(ax:real; bx:real);
var h,x:real; px,py,nx,ny:integer;
const dXY:integer = 4;
begin
PaintXY(ax, bx); SetColor(5); SetLineStyle(3,0,3);
h:=(bx-ax)/(GetMaxX-2*delta); x:=ax; px:=ToX(x); py:=ToY(GetY(x));
MoveTo(px,py);
while (x<bx) do
begin
nx:=ToX(x); ny:=ToY(GetY(x));
if((abs(nx-px)>dXY) or (abs(ny-py)>dXY)) then
begin
LineTo(nx, ny); px:=nx; py:=ny;
end;
x:=x+h;
end;
end;
begin
InitGrp;
xs:=GetMaxX div 2; ys:=(GetMaxY div 2)-80; alpha:=0;
startx:=(GetMaxX div 2)+26; endx:=(GetMaxX div 2)+156;
xc:=startx; yc:=GetMaxY-17; xh:=startx; yh:=yc; r:=16.0; n:=5; xn:=16; yn:=0; kr:=1;
while (not keypressed) do
begin
ClearDevice;
PaintGraph(c_xa, c_xb);
hrest(trunc(xh),trunc(yh),alpha);
if xh=endx then alpha1:=-80;
if xh=startx then alpha1:=80;
alpha:=alpha+alpha1;
if xh=endx then n:=-1;
if xh=startx then n:=1;
xh:=xh+n;
delay(2500);
end;
ReadLn;
ReadLn;
end.
Блок-схема:
Висновок:
На даній лабораторній роботі я згадав навички роботи в графічному середовищі мови програмування Турбо Паскаль та здійснив вивід на екран заданого зображення.