Тема: Розробка та налагодження підпрограми побудови та зображення діаграм та графіків функцій
Теоретичні відомості щодо виконання лабораторної роботи
На практиці часто трапляється: результати вимірювань деяких величин або результати обчислень подавати у графічній формі, наприклад, у вигляді різноманітних діаграм та графіків. Розглянуті в попередній лабораторній роботі графічні засоби дозволяють достатньо просто виконати побудову діаграми (та графіків) на екрані дисплея. Однак, слід зазначити, що у програмах, в яких задіяна графіка, доводиться вирішувати деякі проблеми, які властиві самій прикладній задачі.
Одна з таких проблем пов’язана із системою координат, якою треба користуватися. В багатьох випадках, особливо при математичних обчисленнях, зручно мати справу з дійсними числами, а не з цілими. Крім того, більш звичним і, отже, більш зручним, є напрямок осі Y вгору.
Як ілюстрація (один - найпростіший варіант) вирішення даної проблеми, встановимо звичайну декартову систему координат з початком у нижньому лівому куті екрана і незалежними від розміру екрана (або розміру графічного вікна) координатами, що виражені у вигляді дійсних чисел. Якщо допустити, що ось Х на екрані поділяється на десять одиниць, і позначити її через Xmax, а через Ymax позначити найбільше значення Y в новій системі координат, то:

(причому х=0, у=0 у нижньому лівому куті)
П р и к л а д. Програма DemoBar на екрані дисплея викреслює зображення стовпчикової діаграми, застосовуючи шаблони заповнення.
Program DemoBar;
Uses Crt,Graph;
Const
NumBars=5; {кількість стовпців}
{масив констант, який визначає висоту стовпців}
x:Array[1..NumBars] of ReaL=(1,1.5,4,2.5,1.5);
{масив констант, який визначає стиль заповнення стовпців}
Styles:Array[1..NumBars] of byte = (1,3,10,5,9);
Var
{додатковий масив, що містить висоту стовпців у пікселях, які відповідають висоті стовпців масиву х}
y:Array[1..NumBars] of Integer;
Max:Real;
MaxX,MaxY,
i,x1,y1,x2,y2,
J,s,z,H:Integer;
XStep,YStep:Real;
Color:Word;
Procedure Initialize;
{Процедура Initialize така сама, як і в програмі Example_1}
Function Int2Str(L:LongInt):String;
{Перетворення цілого у рядок для використання у OutText, OutTextXY}
Var
S:String;
Begin
Str(L,S); Int2Str:=S;
End;{Int2Str}
Begin
Initialize;
{визначення максимальних значень екранних координат}
MaxX:=GetMaxX;MaxY:=GetMaxY;
H := 3*TextHeight('M');
Rectangle(0,H,MaxX,MaxY-H); {рамка по периметру екрана}
SetTextJustify(CenterText,TopText);
SetTextStyle(TriplexFont,HorizDir,1);
OutTextXY(MaxX div 2,0,'Histogram !');
SetTextStyle(DefaultFont,HorizDir,1);
x1:=10;y1:=100;x2:=600;y2:=400; {визначення області виводу}
Max:=x[3]; {визначення максимального значення}
{перетворення висоти стовпців, що задані масивом дійсних значень х[i] у екрані координати - масив y[i]}
For i:=1 to NumBars do y[i]:=Round((y2-y1)*x[i]/max);
{вивід на екран осей}
Line(H,H,H,y2); Line(H,y2,x2,y2);
{визначення кроку}
YStep:=(y2-H)/NumBars;
XStep:=(x2-H)/NumBars;
J := y2;
SetTextJustify(BottomText,CenterText);
{позначення осі Y}
For i:=0 to NumBars-1 do
Begin
Line(H div 2,J,H,J);
OutTextXY(H div 6,J,Int2Str(i));
J := Round(J-Ystep);
End;
{позначення осі X, вивід діаграми (bars)}
J := H;
Color:=Black;
SetTextJustify(CenterText,TopText);
For I := 1 to Succ(NumBars) do
Begin
SetColor(White);
Line(J,y2+H div 4,J,y2-H div 4);
OutTextXY(J,y2+(H div 2),Int2Str(I));
If I<>Succ(NumBars) Then
Begin
Inc(Color);
SetFillStyle(Styles[I],Color);
SetColor(Color);
Bar(J,y2-y[I],Round(J+Xstep),y2-1);
{у наступному рядку можна зняти коментар}
{ Rectangle(J,y2-y[I],Round(J+Xstep),y2-1); }
End;
J := Round(J+Xstep);
End;
OutTextXY(MaxX div 2,MaxY-2*H,'Press any key to continue');
Repeat Until KeyPressed;
CloseGraph;
End.
Програма DemoBar має подрібний коментар, тому пояснення не наводяться. Програму DemoBar можна модифікувати, щоб на екрані дисплея зобразити тривимірну стовпчикову діаграму.
П р и к л а д. Програма DemoPie демонструє найпростіший варіант зображення кругової діаграми на екрані дисплея із застосуванням шаблонів заповнення.
Program DemoPie;
Uses Crt,Graph;
Var
MaxX,MaxY,
i,H,x1,y1,x2,y2:Integer;
CenterX,CenterY,Radius:Integer;
Color:Word;
Procedure Initialize;
{Процедура Initialize така сама, як і в програмі Example_1}
Function Int2Str(L:LongInt):String;
{Процедура Int2Str така сама, як і в програмі DemoBar}
Begin {головна програма}
Initialize;
{визначення максимальних значень екранних координат}
MaxX:=GetMaxX;MaxY:=GetMaxY;
H := 3*TextHeight('M');
Rectangle(0,H,MaxX,MaxY-H); {рамка по периметру екрана}
SetTextJustify(CenterText,TopText);
SetTextStyle(TriplexFont,HorizDir,1);
OutTextXY(MaxX div 2,0,'PieSlice Demonstration!');
SetTextStyle(DefaultFont,HorizDir,1);
x1:=10;y1:=100;x2:=600;y2:=400; {визначення області виводу}
{визначення центру і радіусу}
CenterY:=(y2-y1) div 2+70; CenterX:=(x2-x1) div 2;
Radius:=(y2-y1) div 2;
Color:=Blue;
SetTextJustify(CenterText,TopText);
SetFillStyle(SolidFill,Color);
PieSlice(CenterX+10, CenterY,0,90,Radius);
SetTextJustify(LeftText, BottomText);
OutTextXY(CenterX+Radius,CenterY-CenterY div 2,'25 %');
Inc(Color);
SetFillStyle(HatchFill,Color);
PieSlice(CenterX, CenterY, 225, 360, Radius);
SetTextJustify(LeftText, TopText);
OutTextXY(CenterX+Radius,CenterY+CenterY div 2,'37.5 %');
Inc(Color);
SetFillStyle(InterleaveFill,Color);
PieSlice(CenterX-10, CenterY, 135, 225, Radius);
SetTextJustify(RightText, CenterText);
OutTextXY(CenterX-Radius-2*TextWidth('H'),CenterY,'25 %');
Inc(Color);
SetFillStyle(WideDotFill,Color);
PieSlice(CenterX, CenterY, 90, 135, Radius);
SetTextJustify(RightText, BottomText);
OutTextXY(CenterX-Radius div 2,CenterY-Radius,'12.5 %');
SetTextJustify(CenterText, TopText);
OutTextXY(MaxX div 2,MaxY-2*H,'Press any key to continue');
Repeat Until KeyPressed;
CloseGraph;
End.
Завдання щодо виконання лабораторної роботи
Розробити підпрограму побудови гістограми або графіка засобами модуля Graph для програми відповідно до варіанта завдання лабораторної роботи 2.