МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ПОБУДОВА ГРАФІКІВ ФУНКЦІЙ ЗАСОБАМИ МОВИ ТУРБО-ПАСКАЛЬ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 2
З КУРСУ “КОМП’ЮТЕРНА ГРАФІКА”
ПОВНИЙ ТЕКСТ ЗАВДАННЯ
Ознайомитися з методами побудови графіків функцій на екрані монітора комп’ютера.
Вивчити основні процедури мови Турбо-Паскаль для виведення тексту в графічному режимі.
Написати програму, яка будує в середині екрану систему координат XY і на ній графік функції Y=F(X), використовуючи графічні оператори мови Турбо Паскаль, якщо аргумент або параметр змінюється на проміжку [a;b] з кроком h. Варіанти завдань беруть з таблиці 1 за вказівкою викладача.
Таблиця 1.
N% п/п
Функція
Інтервал
Крок
3
x=[0;180]
h=0.15
ОСТАТОЧНА ВЕРСІЯ БЛОК-СХЕМИ АЛГОРИТМУ
Функція Chartstuff
1
2
3
Процедура BuilderX
1 1
2
3
4
5
6
7
8
9
10
11
Процедура BuilderY
1
2
3
4
5
6
7
8
9
10
11
Процедура Coordinate
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
так ні
34
35
36
37
38
Процедура Parameter
1
2
3
Процедура Chart
1 1
2
3
4
5
6
7 ні
так
8
9
10
11 12
Головна програма
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
34
СПИСОК ІДЕНТИФІКАТОРІВ КОНСТАНТ, ЗМІННИХ, ПРОЦЕДУР ТА ФУНКЦІЙ, ВИКОРИСТАНИХ У БЛОК-СХЕМІ АЛГОРИТМУ І ПРОГРАМИ, ТА ЇХ ПОЯСНЕННЯ
СПИСОК :
Driver
Mode
ERROR
A
B
H
STDIMX
STDIMY
YMAX
YMIN
X
Y
KX
KY
MAXRX
MAXRY
X0
Y0
BUFMIN
POZ
POZX
POZY
STEP
GX
GY
MAXGX
MAXGY
SKY
SKX
ARROW
VALUEX
VALUEY
MAXGZONEX
MAXGZONEY
I
YCOUT
XCOUT
TEXT
ПОЯСНЕННЯ ІДЕНТИФІКАТОРІВ ЗМІННИХ :
Driver – характеризує тип графічного драйвера
Mode – визначає режим роботи графічного адаптера
Error – код помилки
A – ліва межа табулювання
B – права межа табулювання
H – крок табулювання
Stdimx – найменше розширення по х
Stdimy – найменше розширення по у
Ymax – максимальне значення функції
Ymin – мінімальне значення функції
X – координата по осі абсцис
Y – координата по осі ординат
Kx – коефіцієнт перетворення по осі абсцис
Ky – коефіцієнт перетворення по осі ординат
Maxrx – проміжок на якому графік лежить по осі абсцис
Maxry – проміжок на якому графік лежить по осі ординат
X0 – координата графічного центра по осі абсцис
Y0 – координата графічного центра по осі ординат
Bufmin – покрокове сумування значень по осі абсцис чи
ординат
Poz – положення тексту при виводі по осі абсцис чи ординат
Pozx – положення графічного центру по осі абсцис для
розмітки осі абсцис
Pozy – положення графічного центру по осі ординат для
розмітки осі ординат
Step – крок табулювання для розмітки осей абсцис та ординат
Gx – графічна координата по осі абсцис
Gy – графічна координата по осі ординат
Maxgx – максимальне горизонтальне розширення екрану
Maxgy – максимальне вертикальне розширення екрану
Sky – відступ по осі ординат для мінімального розширення
Skх – відступ по осі абсцис для мінімального розширення
Arrow – розмір стрілок
Valuex – коефіцієнт перетворення екрану по осі абсцис
відносно мінімального розширення
Valuey - коефіцієнт перетворення екрану по осі ординат
відносно мінімального розширення
Maxgzonex – область що займатиме графік по осі абсцис на
екрані
Maxgzoney – область що займатиме графік по осі ординат на
екрані
I – лічильник
Ycout – лічильник для розмітці осі ординат
Xcout – лічильник для розмітці осі абсцис
Text – змінна для виводу тексту розмітки
ПОЯСНЕННЯ ПРОЦЕДУР ТА ФУНКЦІЙ :
INITGRAPH – ініціалізує графічний режим
GRAPHRESULT – тестує роботу графічного режиму
Chartstuff – функція для графіка функції
Coordinate – процедура розмітки осей
BuilderХ – процедура побудови осі абсцис
BuilderY – процедура побудови осі ординат
Str – процедура перетворення числового значення у текстове
Settextstyle – процедура, що задає тип шрифта та його положення
Setcolor – процедура ,що задає колір ліній
Outtextxy – процедура виводу тексту на екран у вказаній точці
Chart – процедура побудови графіка функції
Lineto – процедура побудови ліній від поточного положення вказівника до вказаної точки
Setlinestyle – процедура, що задає тип ліній
Moveto – процедура, що переміщає вказівник у вказане положення
Parameter – процедура для визначення коефіцієнтів перетворення графіку
ОСТАТОЧНА ВЕРСІЯ ПРОГРАМИ
Program ChartBuilder;
Uses Graph,crt;
var Driver,Mode,Error:integer;
a,b,h,stdimx,stdimy,ymax,ymin,x,y,kx,ky,maxrx,maxry,x0,y0,bufmin,bufmax,poz,pozx,pozy,step:real;
gx,gy:real;
maxgx,maxgy,sky,skx,arrow,valuex,valuey,maxgzonex,maxgzoney:integer;
i,ycout,xcout:integer;
text:string;
{Specified Function for chart building start}
function ChartStuff(x:real):real;
begin
ChartStuff:=90*cos(x+ln(x)/20);
end;
{Specified Function for chart building start}
{Building OX and OY and Writing Coordinates Start}
procedure Coordinate(x0,y0:real);
procedure BuilderX(x0,y0:real);
begin
moveto(trunc(x0),trunc(y0));
lineto(skx*valuex,trunc(y0));
moveto(trunc(x0),trunc(y0));
lineto(maxgx-skx*valuex,trunc(y0));
lineto(maxgx-trunc(skx*valuex/2),trunc(y0));
lineto(maxgx-trunc(skx*valuex/2)-arrow*valuex,trunc(y0)+arrow*valuey);
moveto(maxgx-trunc(skx*valuex/2),trunc(y0));
lineto(maxgx-trunc(skx*valuex/2)-arrow*valuex,trunc(y0)-arrow*valuey);
outtextxy(maxgx-trunc(skx*valuex/2)-arrow*valuex,trunc(y0)+arrow*arrow*valuey,'X');
end;
procedure BuilderY(x0,y0:real);
begin
moveto(trunc(x0),trunc(y0));
lineto(trunc(x0),maxgy-sky*valuey);
moveto(trunc(x0),trunc(y0));
lineto(trunc(x0),sky*valuey);
lineto(trunc(x0),trunc(sky*valuey/2));
lineto(trunc(x0)-arrow*valuex,trunc(sky*valuey/2)+arrow*valuey);
moveto(trunc(x0),trunc(sky*valuey/2));
lineto(trunc(x0)+arrow*valuex,trunc(sky*valuey/2)+arrow*valuey);
outtextxy(trunc(x0)+arrow*arrow*valuex,trunc(sky*valuey/2)+arrow*valuey,'Y');
end;
begin
x0:=trunc(skx*valuex-a*kx);
y0:=trunc(sky*valuey+ymax*ky);
if(x0<=skx*valuex)
then
x0:=skx*valuex
else
if(x0>=maxgx-skx*valuex)
then
x0:=maxgx-skx*valuex;
if(y0<=sky*valuey)
then
y0:=sky*valuey
else
if(y0>=maxgy-sky*valuey)
then
y0:=maxgy-sky*valuey;
builderX(x0,y0);
builderY(x0,y0);
pozx:=x0;
pozy:=y0;
{X Step Select}
step:=abs(b-a)/20;
{X Step Select}
{Writing Coordinates x Start}
x0:=trunc(skx*valuex-a*kx);
y0:=trunc(pozy);
BufMin:=a;
for xcout:=1 to 21
do
begin
Poz:=trunc(x0+BufMin*kx);
str(BufMin:2:1,text);
if((bufmin>=-step/(b-a))and(bufmin<=step/(b-a)))
then
text:='0'
else
line(trunc(poz),trunc(y0+arrow*valuey),trunc(poz),trunc(y0-arrow*valuey));
settextstyle(SansSeriffont,1,0);
outtextxy(trunc(poz),trunc(y0+arrow*valuey),text);
bufMin:=BufMin+step;
end;
{Writing Coordinates x end}
{Y Step Select}
step:=abs(ymax-ymin)/20;
{Y Step Select}
{Writing Coordinates y}
y0:=trunc(sky*valuey+ymax*ky);
x0:=trunc(pozx);
BufMin:=ymin;
for ycout:=1 to 21
do
begin
Poz:=trunc(y0-BufMin*ky);
str(Bufmin:2:1,text);
if(not((bufmin>=-step/(b-a))and(bufmin<=step/(b-a))))
then
begin
settextstyle(SansSeriffont,0,0);
outtextxy(trunc(x0+arrow*valuex),trunc(poz),text);
line(trunc(x0)+arrow*valuex,trunc(poz),trunc(x0)-arrow*valuex,trunc(poz));
end;
bufMin:=BufMin+step;
end;
{Writing Coordinates y End}
end;
{Building OX and OY and Writing Coordinates End}
{Searching increase values Start}
procedure Parameter(a,b,ymax,ymin:real);
begin
maxgzonex:=maxgx-2*skx*valuex;
maxgzoney:=maxgy-2*sky*valuey;
maxrx:=abs(b-a);
maxry:=ymax-ymin;
kx:=maxgzonex/maxrx;
ky:=maxgzoney/maxry;
end;
{Searching increase values End}
{Building of Chart Start}
procedure Chart(x0,y0:real);
begin
setlinestyle(3,0,3);
setcolor(yellow);
x0:=trunc(skx*valuex-a*kx);
y0:=trunc(sky*valuey+ymax*ky);
x:=a;
gx:=x0+kx*(x);
gy:=y0-chartstuff(x)*ky;
moveto(trunc(gx),trunc(gy));
while(x<=b) do
begin
x:=x+h;
gx:=x0+kx*x;
gy:=y0-ky*chartstuff(x);
lineto(trunc(gx),trunc(gy));
end;
setlinestyle(0,0,1);
setcolor(white);
{Building of Chart End}
end;
begin
clrscr;
{Starting Conditions Input Start}
writeln('Enter Driver Type(15 is recommended;Auto Choice - 0) : ');
readln(Driver);
writeln('Enter Driver Mode(3 is recommended;Auto Choice - 0) : ');
readln(Mode);
Writeln('Enter left Tabulation Border a(variant 3 = 0.15) : ');
readln(a);
Writeln('Enter Right Tabulation Border b(variant 3 = 180) : ');
readln(b);
writeln('Enter Tabulation step h(variant 3 = 0.15) : ');
readln(h);
{Starting Conditions Input End}
{Graph Mode Initialization Start}
InitGraph(Driver,Mode,'');
{Graph Mode Initialization End}
{Error Self-Checking Procedure Start}
Error:=GraphResult;
if Error<>grOk then
begin
writeln(GraphErrorMsg(Error));
end;
{Error Self-Checking Procedure End}
maxgx:=trunc(getmaxx);
maxgy:=trunc(getmaxy);
{Standart Dimensions Start}
stdimx:=320;
stdimy:=200;
skx:=30;
sky:=25;
arrow:=3;
{Standart Dimensions End}
{Searching for Chart Machine Area Start}
for i:=1 to 20 do
begin
valuey:=trunc(maxgy/stdimy);
valuex:=trunc(maxgx/stdimx);
if(valuex=i) then skx:=trunc(valuex*skx/i);
if(valuey=i) then sky:=trunc(valuey*sky/i);
end;
{Searching for Chart Machine Area End}
{Searching Y max and Y min Value Start}
x:=a;
ymin:=chartstuff(x);
x:=b;
ymax:=chartstuff(x);
x:=a;
while(x<=b) do
begin
y:=chartstuff(x);
x:=x+h;
if(y>=ymax)
then ymax:=y
else
if(y<=ymin)
then ymin:=y;
end;
{Searching Y max and Y min Value End}
{Building Graph Start}
parameter(a,b,ymax,ymin);
chart(x0,y0);
coordinate(x0,y0);
{Building Graph End}
readln;
end.
РЕЗУЛЬТАТИ РОБОТИ ПРОГРАМИ