Энциклопедия Turbo Pascal. Главы 9-11
Страница 22. Гистограммы и круговые диаграммы


Гистограммы и круговые диаграммы

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

 
Следующая статья »