Энциклопедия 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.