Энциклопедия Turbo Pascal. Главы 9-11 - Гистограммы и круговые диаграммы
ОГЛАВЛЕНИЕ
Гистограммы и круговые диаграммы
Графический инструментарий предоставляет процедуры, позволяющие вам нарисовать гистограммы и круговые диаграммы. Существуют две процедуры для реализации круговых диаграмм: DrawPolarPie и DrawCartPie. Они отличаются способом задания местоположения и радиуса круговой диаграммы: в полярных или декартовых координатах. Легче пользоваться процедурой DrawPolarPie. Она задается следующим образом
procedure DrawPolarPie(X, Y, Radius, Theta, Inner, Outer:real; Info: PieArray; Num, Option,TextSize: integer);
X,Y - координаты центра, radius - радиус круговой диаграммы и Theta - угол (в градусах) первого сегмента. Параметр Inner и Outer определяют длину линии метки указателя. Info - это матрица типа PieArray, которая определяется следующим образом:
type
PieType = record
Area: real;
Text: wrkstring;
end;
PieArray = array[1..MaxPiesGlb] of PieType;
Параметр Num должен определять число сегментов, а Option устанавливается в соответствии со следующей таблицей:
Значение Option Смысл
0 Нет меток
1 Только текстовые метки
2 Метка из текста и значений
3 Метки только из значений
Наконец, параметр TextSize определяет размер машинно-независимых символов, используемых в метках. Программисты, которые используют процедуру DrawPolarPie, должны также включить следующие файлы в указанном порядке:
{Si circsegm.hgh}
{Si pie.hgh}
Для использования DrawPolarPie вы должны сначала загрузить 0 значения сегментов в Info.Area и метки, связанные с этими сегментами в Info.Text. Наконец, вы присваиваете соответствующие значения остальным параметрам и рисуете круговую диаграмму. Процедура, следующая далее, рисует программу, показанную на рис.10-7.
procedure PlotPie;
var
Radius, Theta, InRad, OuterRad: real;
Mode, Size: integer;
Products: PieArray;
begin
DefineWindow(1, 0, 0, 50, 100);
DefineHeader(1, 'Exports in Billions');
DefineWorld(1, 0, 0, 1000, 1000);
SelectWorld(1);
SelectWindow(1);
SetHeaderOn;
DrawBorder;
Products[1].Text: = 'Wheat S';
Products[2].Text: = 'Corn S';
Products[3].Text: = 'Manu. Goods S';
Products[4].Text: = 'Electronics S';
Products[5].Text: = 'Misc. S';
Products[1].Area: = 15;
Products[2].Area: = 12.4;
Products[3].Area: = 7.34;
Products[4].Area: = -24; {вытолкнуть}
Products[5].Area: = 16;
Radius: = 125;
Theta: = 60;
SetAspect(1.0);
InRad: = 0.85;
DuterRad: = 1.5;
Mode: = 2; {установить рисование обеих меток}
Size: = 1; {установить малый размер текста}
DrawPolarPie(500, 500, Radius, Theta, InRad,
OuterRad, Products, 5, Mode, Size);
end; {PlotPie}
Для того, чтобы нарисовать гистограмму, требуется использовать процедуру DrawHistogram, которая декларируется следующим образом:
procedure DrawHictogram(Info: PlotArray; Num: integer;
Hatch: Boolean; HatchStyle:integer);
Параметр Info содержит значение, связанное с каждой полосой.
------------------------------------------------------
----------------------------¬
L---------------------------
----------------------------¬
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
L---------------------------
--------------------¬
L-------------------
--------------------¬
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
L--------------------
Рис.10-7. Круговая диаграмма и гистограмма
Это двумерная матрица, где для любого Info[i,1] зарезервирован для внутреннего использования, а Info[i,2] должен содержать значение полосы для i. Если параметр Hatch равен TRUE, то каждая полоса заштриховывается. Параметр HatchStyle определяет частоту штрихования; значение 1 задает самую частую штриховку. Нельзя рисовать метки непосредственно используя процедуру DrawHistogram.
Вы должны включить следующие файлы в порядке, показанном далее, в любую программу, которая использует DrawHistogram:
{Si hatch.hgh}
{Si histogrm.hgh}
Процедура, показанная далее, иллюстрирует использование DrawHistogram. Она порождает гистограмму, показанную на рис.10-7.
procedure PlotBar;
var
Products: PlotArray;
begin
DefineWindow(2, 40, 110, 70, 180);
DefineHeader(2, 'Exports in Billions');
DefineWorld(2, 0, 0, 30, 35);
SelectWorld(2);
SelectWindow(2);
SetHeaderOn;
SetBackground(0);
DrawBorder;
Products[1,2]: = 15;
Products[2,2]: = 12.4;
Products[3,2]: = 7.34;
Products[4,2]: = 24;
Products[5,2]: = 16;
DrawHistogram(Products, 5, true, 5);
DrawTextW(1, 2, 1, 'Wheat Corn Manu. Elec. Misc.');
DrawTextW(1, 7, 1, 'S15 S12.4 S7.34 S24 S16');
end; {PlotBar}
Отметим, что метки естественным образом включаются с помощью процедуры DrawTextW.
Для вашего удобства гистограмма и круговая диаграмма показаны далее в одной программе:
program Presentation_graphics;
{Si typedef.sys}
{Si graphix.sys}
{Si kernel.sys}
{Si circsegm.hgh}
{Si pie.hgh}
{Si hatch.hgh}
{Si histogrm.hgh}
procedure PlotPie;
var
Radius, Theta, InRad, OuterRad: real;
Mode, Size: integer;
Products: PieArray;
begin
ClearScreen;
SetColorWhite;
DefineWindom(1, 0, 0, 50, 100);
DefineHeader(1, 'Exports in Billions');
DefineWorld(1, 0, 0, 1000, 1000);
SelectWorld(1);
SelectWindom(1);
SetHeaderOn;
SetBackground(0);
DrawBorder;
Products[1].Text:='Wheat S';
Products[2].Text:='Corn S';
Products[3].Text:='Manu. Goods S';
Products[4].Text:='Electronics S';
Products[5].Text:='Mics. S';
Products[1].Area:=15;
Products[2].Area:=12.4;
Products[3].Area:=7.34;
Products[4].Area:=-24; {вытолкнуть}
Products[5].Area:=16;
Radius: = 125;
Theta: = 60;
SetAspect(1.0);
InRad: = 0.85;
OuterRad: = 1.5;
Mode:=2; {установить рисование обеих меток}
Size:=1; { установить малый размер текста }
DrawPolarPie(500, 500, Radius, Thete, InRad,
OuterRad,Products, 5,Mode, Size);
end; {PlotPie}
procedure PlotBar;
var
Products: PlotArray;
begin
DefineWindow(2, 40, 110, 70, 180);
DefineHeader(2, 'Exports in Billions');
DefineWorld(2, 0, 0, 30, 35); 1
SelectWorld(2);
SelectWindow(2);
SetHeaderOn;
SetBackground(0);
DrawBorder;
Products[1,2]: = 15;
Products[2,2]: = 12.4;
Products[3,2]: = 7.34;
Products[4,2]: = 24;
Products[5,2]: = 16;
DrawHistogram(Products, 5, true, 5);
DrawTextW(1, 2, 1, 'Wheat Corn Manu. Elet. Mias.');
DarwTextW(1, 7, 1, S15 S12.4 S7.34 S24 S16');
end; {PlotBar}
begin
InitGraphic;
PlotPie;
PlotBar;
repeat untei KeyPressed;
LeaveGraphic;
end.