Страница 22 из 39
Гистограммы и круговые диаграммы Графический инструментарий предоставляет процедуры, позволя- ющие вам нарисовать гистограммы и круговые диаграммы. Существуют две процедуры для реализации круговых диаграмм: 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.
|