МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
кафедра „Захист Інформації”
ГРАФІЧНО-РОЗРАХУНКОВА РОБОТА
ПОБУДОВА ГРАФІКА ФУНКЦІЇ ТА РУХОМОГО ЗОБРАЖЕННЯ НА ЕКРАНІ КОМП’ЮТЕРА
з курсу
"КОМП’ЮТЕРНА ГРАФІКА"
Львів - 2010
ЗАВДАННЯ
1) Побудувати графік функції, заданої таблично. Масштаб розмітки осей координат графіка повинен відповідати реальним результатам розрахунків. Параметри для побудови графіка визначені в таблиці 2. Варіант завдання визначає викладач.
Необхідно передбачити “плаваючий” центр координат – основну частину екрану мають займати ті чверті, в яких знаходиться графік функції.
№ варіанту
Функція f(x)
Діапазон зміни аргументу
17
y=ch(x)
[0; 20]
Параметри графіку
№ варіанту
Тип лінії для побудови кривої графіка
Товщина лінії (пікселів)
Колір лінії
Шрифт розмітки осей графіка
17
2
Green
Gothic
2) Створити на екрані комп’ютера графічне вікно і сформувати в ньому рухоме зображення. Вікно розмістити в верхньому правому куті екрану. Навести межі вікна. Параметри рухомого зображення визначені в таблиці 3. Параметри зображення задані в пікселах. Варіант завдання визначає викладач.
Графік і вікно з рухомим зображенням повинні бути присутні на екрані одночасно, причому вікно не має перекривати графік (рис.1).
№ варіанту
Структура зображення
Пояснення
17
Затухаючі перекочування кола зі спицями діаметру d з гіпотенузи одного прямокутного трикутника на гіпотенузу іншого. Катети трикутників рівні і становлять a і b.
Параметри : a=150, b=90, d=25
СПИСОК ІДЕНТИФІКАТОРІВ ПРОГРАМИ
Підпрограмми та процедури
InitGrp – підпрограма для ініціалізації необхідного графічного режиму відео адаптера;
GetMinMaxY – підпрограма для визначення максимального та мінімального значення функції на проміжку;
GetY – підпрограма для обчислення значення функції в точці;
ToX – підпрограма для приведення значень х до значень на дисплеї;
ToY – підпрограма для приведення значень у до значень на дисплеї;
PaintXY – підпрограма для побудови осей координат та їх підпису;
Fon – підпрограма для виводу вікна та трикутників;
PaintGraph – підпрограма яка будує графік функції;
Solve – підпрограма яка моделює рух кола по поверхні трикутника;
GoPlay – підпрограма яка виводить зображення кола, що рухається по поверхнях трикутників;
Функції
Setfillstyle – підпрограма яка задає тип заливки
Bar – підпрограма яка виводить прямокутник;
Setcolor – підпрограма для задання кольору фігур;
InitGraph – підпрограма для ініціалізації графічного режиму адаптера;
Writeln – підпрограма для виведення тексту на екран;
Halt- підпрограма для завершення роботи програми з кодом виходу;
Round – підпрограма заокруглення дійсного числа;
Floodfill – підпрограма заливки області графічного зображення;
Delay – підпрограма для вичікування затримки між операціями;
Keypressed – підпрограма яка сигналізує про натиск клавіші на клавіатурі;
Circle – підпрограма яка виводить на екран коло заданого радіусу;
Div – функція ділення націло числа;
Блок-схема алгоритму програми
Код програми
Uses Graph, CRT;
var xmax, ymax, px0, py0: integer;
kx, ky, x0, y0:real;
const delta:integer = 25; {vidstup vid kray ekrana}
ws_delta:integer = 10; {vidstan u vikni}
a:integer = 150; {razmir trucutnuka}
b:integer = 90;
d:integer = 25;
cur_x:integer = 11; {razmir cursora}
cur_y:integer = 5;
cur_p:integer = 8; {rozmir podilku}
np_x:integer = 10; {kilkist' tochok na graph}
np_y:integer = 7;
c_xa:integer = 0; {pochatok tabuluvanna}
c_xb:integer = 20; {kinec' tabuluvanna}
procedure InitGrp; {iniciluvann9 grafi4nogo regumu ta pobudiva bar. and pol9}
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,7);
bar(0,0,GetMaxX,GetMaxY);
end;
function GetY(x:real) : real; {ob4uslue zna4enn9 y v dannoy to4ci}
begin
GetY:=(exp(x)+exp(-x))/2;
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:=px0 + (x0+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
{graph x}
gx_min:=ax; gx_max:=bx;
if(bx<0) then begin gx_max:=0; end
else if(ax>0) then gx_min:=0;
{graph y}
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;
{calc kx, ky}
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;
{paint oX}
SetColor(0); SetLineStyle(0,0,0);
SetTextStyle(SmallFont,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');
{paint oY}
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(cur_p/2), y-3, s);
end;
end;
OutTextXY(x+10, delta, 'Y');
end;
procedure Fon(first:boolean);
var cx, cy, ws_x, ws_y:integer;
begin
{window}
setfillstyle(1,15); setcolor(8);
SetLineStyle(0,0,0);
ws_x:=2*(b+ws_delta);
ws_y:=a+ws_delta+d;
cx:=round(GetMaxX/2-ws_x/2);
bar(cx,0,cx+ws_x,ws_y); MoveTo(cx, 0);
LineRel(0, ws_y); LineRel(ws_x,0);
LineRel(0,-ws_y); LineRel(-ws_x,0);
{tr left}
setfillstyle(1,2);
MoveTo(cx+ws_delta, ws_y-ws_delta);
LineRel(b,0); LineRel(-b,-a); LineRel(0,a);
FloodFill(cx+ws_delta+1, ws_y-ws_delta-1, 8);
{tria right}
MoveTo(cx+ws_x-ws_delta, ws_y-ws_delta);
LineRel(-b,0); LineRel(b, -a); LineRel(0, a);
FloodFill(cx+ws_x-ws_delta-1, ws_y-ws_delta-1, 8);
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(Green);
SetLineStyle(2,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;
procedure Solve(sx:integer; sy:integer; ymin:real; ymax:real;
var x:real; var y:real; var s:real);
var dx, dy, xx,yy, alpha:real;
const
maxd:integer = 5000;
mind:integer = 500;
begin
dx:=b/200; dy:=a/200;
while ( ((sy<0) and (y>ymin)) or ((sy>0) and (y<ymax))) do
begin
setcolor(0); setfillstyle(1,15);
circle(round(x),round(y),round(d/2));
floodfill(round(x),round(y),0);
setcolor(15);
circle(round(x),round(y),round(d/2));
circle(round(x),round(y-1),round(d/2));
x:=x+sx*dx; y:=y+sy*dy; setcolor(8);
circle(round(x),round(y),round(d/2));
if(sx>0) then s:=s+sqrt(dx*dx+dy*dy)
else s:=s-sqrt(dx*dx+dy*dy);
alpha:=8*3*s/d/d+pi/4;
xx:=d/2*cos(alpha); yy:=d/2*sin(alpha);
Line(round(x-xx),round(y-yy),round(x+xx),round(y+yy));
xx:=d/2*cos(alpha+pi/2); yy:=d/2*sin(alpha+pi/2);
Line(round(x-xx),round(y-yy),round(x+xx),round(y+yy));
if(keypressed) then halt(0);
delay(round((ymax-y)/(ymax-ymin)*maxd)+mind);
end;
end;
procedure GoPlay;
var x,y,ws_x, ws_y, beta, ymin, ymax, s,rr:real;
r:integer;
begin
{Fon;}
ws_x:=2*(b+ws_delta); r:=round(d/2);
ws_y:=a+ws_delta+d;
beta:=pi/2-Arctan(b/a);
ymin:=ws_y-a-ws_delta;
ymax:=147;
x:=GetMaxX/2+ws_x/2-ws_delta-16;
y:=ymin; s:=0;
Fon(true); rr:=(ymax-ymin+1)/9;
while (ymax-ymin>2) do
begin
Solve(-1,1,ymin, ymax, x,y,s);
ymin:=ymin+rr;
Solve(-1,-1,ymin, ymax, x,y,s);
Solve(1,1,ymin,ymax,x,y,s);
ymin:=ymin+rr;{(ymax-ymin)/5; }
Solve(1,-1,ymin,ymax,x,y,s);
end;
end;
begin
InitGrp;
PaintGraph(c_xa, c_xb);
GoPlay;
ReadLn;
end.
Висновок : Виконавши дану графічну-розрахункову роботу я покращив свої навики в розробці рухомих зображень в середовищі Турбо Паскаль.