Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра «Захисту інформації»
               
Розрахункова робота
З курсу:
“Копм’ютерна графіка”
 
Варіант: 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.
Блок-схема:
  
Висновок: 
	На даній лабораторній роботі я згадав навички роботи в графічному середовищі мови програмування Турбо Паскаль та здійснив вивід на екран заданого зображення.