Энциклопедия Turbo Pascal. Главы 5-8
Страница 10. Вывод на экран простых графиков


Вывод на экран простых графиков

     Применение графиков в статистике позволяет  просто  и  точно
передать  смысл  данных.  График  позволяет сразу же понять,  как
распределены данные и как изменяются их значения.  Здесь рассмат-
риваются только двумерные графики, использующие двумерную систему
координат X-Y.  /Получение трехмерных графиков является отдельной
дисциплиной и выходит за рамки данной книги/.
     Имеется две распространенные формы двумерных графиков: стол-
биковые  диаграммы  и  точечные графики.  В столбиковой диаграмме
каждое значение представляется заштри{ованным столбиком.  На  то-
чечном  графике каждый элемент изображается точкой с координатами
X и Y. Примеры графиков показаны на рис.23.

         ¦                   ¦
         ¦          -¬       ¦
         ¦    -¬    ¦¦       ¦
         ¦ -¬ ¦¦    ¦¦       ¦
         ¦ ¦¦ ¦¦ -¬ ¦¦       ¦
         ¦ ¦¦ ¦¦ ¦¦ ¦¦       ¦
         L-++-++-++-++----   L-----------------
         a                    б
    Рис.23. Примеры столбиковой диаграммы (а) и точечного графика
(б)

     Столбиковая диаграмма  обычно  используется при относительно
небольшом количестве данных, например, при представлении валового
национального  продукта  за последние десять лет или ежемесячного
выпуска на предприятии в процентном отношении.  Точечные  графики
обычно  используются при выводе большого числа данных,  например,
для вывода ежедневного курса акций некоторой фирмы в течение  го-
да. Применение получила также модификация точечного графика, ког-
да соседние точки соединяют линией.
     Разработанные в  этой главе графические функции требуют при-
менения ПЭВМ фирмы IBM (или совместимых с ними ПЭВМ) с  графичес-
ким адаптером CGA или EGA.  Эти подпрограммы рассчитаны на приме-
нении четвертого режима вывода графиков. Графические подпрограммы
используют  графические  функции Турбо Паскаля версии 4,  которые
отличаются от графических функций предыдущих версий.  Если вы ис-
пользуете  предыдущую  версию  Турбо Паскаля,  то вам потребуется
сделать соответствующие изменения.
     Используются следующие графические функции:

Название                 Назначение
----------------   ----------------------------------------------
InitGraph          Инициирует графическое оборудование
SetColor           Устанавливает цвет рисунка для большинства

                   графических программ
SetLine            Определяет тип линий, выводимых посредством
                   процедуры "Line"
Line               Выводит линии на экран с текущим цветом
PupPixel           Выводит элемент изображения в заданном цвете
RestoreCrtMode     Восстанавливает режим работы видеотерминала
                   в состояние до вызова "InitGraph"
OutTextXY          Записывает строку в заданную позицию,
                   нахoдясь в графическом режиме работы

     Эти подпрограммы используют блок "Graph". Подробное описание
этих и других графических функций дается в справочном руководстве
по языку Турбо Паскаль версии 4.
     Ниже приводится  простая  графическая  функция,  формирующая
столбиковую диаграмму на ПЭВМ фирмы IBM:

          uses
            crt, graph;

          const
            MAX = 100;

          type
            DataItem = real;
            DataArray = array [1..MAX] of DataItem;
          var
            data: DataArray;

          procedure Simpleplot(data: DataArray; num: integer);

          var
            t, incr:integer;
            a: real;
            ch: char;
            GraphDriver, Craphmode : ineger;
            x, y : integer;

          begin
            { установка режима 4 для адаптеров EGA и CGA }
            GraphDriver := CGA ;
            Craphmode := CGAC1 ;
            InitGraph(GraphDriver, Craphmode, '');
            SetColor(1);
            SetLineStyle(Solid, 0, NormWidth);

           { вычерчивание сетки }
             OutTextXY(0, 191, '0'); { минимум }
             OutTextXY(0, 0, '190'); { максимум }
             OutTextXY(290, 191, '300'); { число }
             for t := 1 to 19 do PutPixel(0, t*10, 1);
             SetColor(3);
             Line(x, 190, x, 190-y);
             SetColor(2);
             for t := 1 to num do
              begin
                a := data[t];
                y := trunc(a);
                incr := 10;
                x := ((t-1)*incr)+20
                Line(x, 190, x, 190-y);
              end;
              ch:= ReadKey;
              RestoreCrtMode;
            end; { конец процедуры вывывода простого графика }

     Для ПЭВМ фирмы IBM режим с максимальной разрешающей  способ-
ностью  в  320х200  точек  устанавливается  с  помощью  процедуры
"InitGraph". Процедура "OutTextXy" устанавливает курсор в позицию
с  требуемыми  координатами Х и Y и делает вывод заданной строки.
Процедура "Line" имеет следующую общую форму:
      Line (начало_Х, начало_Y, конец_Х, конец_Y), где все значе-
ния задаются целыми числами. При выводе строки используется теку-
щий цвет,  определенный при вызове процедуры "SetColor". Дополни-
тельные сведения вы можете  найти  в  справочном  руководстве  по
языку Турбо Паскаль.
     В этом примере процедура вывода графика  обладает  серьезным
недостатком. Предполагается, что все данные находятся в диапазоне
от нуля до 190,  поскольку только эти значения можно задавать при
вызове графической функции "Line".  Это предположение хорошо сра-
ботает в маловероятном случае,  когда ваши данные точно будут ле-
жать в этом диапазоне. Для вывода данных в любом диапазоне значе-
ний эти данные должны быть нормализованы перед выводом так, чтобы
не выходить за допустимый диапазон значений.  Нормализация заклю-
чается в поиске коэффициента отношения  действительного диапазона
значений  данных  и физического диапазона разрешающей способности
экрана.  Значение каждого данного затем должно быть  умножено  на
этот коэффициент и получено число,  попадающее в диапазон экрана.
Нормализация по оси Y должна делаться по следующей формуле:
                 250
        Y = Y* ---------
              (max-min)
где Y является тем значением, которое передается процедуре вывода
графика.  Та же формула должна использоваться для расширения шка-
лы,  когда диапазон значений данных очень маленький. В таком слу-
чае экран дисплея будет использоваться наиболее рационально.
     Функция "BarPlot" масштабирует оси Х и Y и выводит столбико-
вый график для 300 элементов.  Предполагается, что по оси Х зада-
ется время с единичным шагом.  Процедура нормализации находит ми-
нимальное  и максимальное значение в выборке и затем вы - числяет
их разницу.  Это число,  которое представляет разброс между мини-
мальным  и максимальным значениями,  затем делится на разрешающую
способность экрана,.  Для графического режима 4 это  число  равно
190 для оси Y и 300 для оси Х /поскольку требуется место для гра-
ничных полей и основной строки/. Полученный коэффициент затем ис-
пользуется для масштабирования данных выборки.

          { вывод столбиковой диаграммы }

          procedure BarPlot(data: DataArray; num: integer);
          var
            x, y, max, min, incr, t:integer;
            a, norm, spread: real;
            ch: char;
            value: string[80];

          begin
            { установка режима 4 для адаптеров EGA и CGA }
            GraphDriver := CGA ;
            Craphmode := CGAC1 ;
            InitGraph(GraphDriver, Craphmode, '');
            SetColor(1);
            SetLineStyle(Solid, 0, NormWidth);

            { сначала для нормализации находится минимальное и
              максимальное значение }
            max := getmax(data, num)
            min := getmin(data, num)
            if min>0 then min := 0;
            spread := max - min;
            norm := 190/spread;

           { вычерчивание сетки }
             str(min, value);
             OutTextXY(0, 191, value); { минимум }
             str(max, value);
             OutTextXY(0, 0, value); { максимум }
             str(num, value);
             OutTextXY(300, 191, value); { число }
             for t := 1 to 19 do PupPixel(0, t*10, 1);
             SetColor(3);
             Line(0, 190, 320, 190);
             SetColor(2);

           { вывод данных }

             for t := 1 to num do
              begin
                a := data[t]-min;
                a := a*norm;
                y := trunc(a);
                incr := 300 div num;
                x := ((t-1)*incr)+20
                Line(x, 190, x, 190-y);
              end;
              ch := Readkey;
              RestoreCrtMode;
          end; { BarPlot }

     Эта версия программы кроме того делает вывод точек по оси Y.
Расстояние между точками равно 1/20 разнице между  максимальным и
минимальным  значением.  На  рис.24 приводится пример столбиковой
диаграммы для двадцати элементов,  полученной с помощью процедуры
"BarPlot".  Конечно, эта процедура не обладает всеми желательными
свойствами, но она дает хороший вывод одной выборки. Эту процеду-
ру  можно  легко усовершенствовать и сделать ее более удобной для
конкретного случая.

   .95                                         |
   .                                           |              |
   .             |                             |              |
   .       |     |                             |     |        |
   .       |     |        |                    |  |  |        |
   .       |     |        |                    |  |  |        |
   .    |  |     |     |  |                    |  |  |        |
   .    |  |     |     |  |                    |  |  |        |
   .    |  |     |     |  |        |           |  |  |        |
   .    |  |     |     |  |        |           |  |  |     |  |
   .    |  |     |  |  |  |        |  |  |     |  |  |     |  |
   .    |  |     |  |  |  |        |  |  |     |  |  |     |  |
   .    |  |     |  |  |  |     |  |  |  |     |  |  |  |  |  |
   .    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
   . |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
   . |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
   . |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
   __|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
                                                      20

      Рис 24. Пример столбиковой диаграммы, полученной с помощью
              процедуры "BarPlot"

     Для получения процедуры по выводу точечных графиков требует-
ся сделать только небольшие изменения в процедуре  "BarPlot"  Ос-
новное  изменение связано с заменой функции "Line" на функцию вы-
вода одной точки.  Для этого используется  функция  "PutPixel"  В
общем виде она записывается в следующей форме:

          PutPixel(x,y,цвет)

где все аргументы являются целыми числами.  Цвет каждой выводимой
точки задается параметром "цвет".  Для режима 4 он должен  прини-
мать значения от 0 до 3. Ниже приводится функция "ScatterPlot":

          { вывод точечного графика }

          procedure ScatterPlot(data: DataArray; num, ymin,
          ymax, xmax, xmin: integer);
          var
            x, y, incr, t:integer;
            a, norm, spread: real;
            ch: char;
            value: string[80];
          begin

            { сначала для нормализации находится минимальное и
              максимальное значение }

            if ymin>0 then ymin := 0;
            spread := ymax - ymin;
            norm := 190/spread;

           { вычерчивание сетки }
             str(ymin, value);
             OutTextXY(0, 191, value); { минимум }
             str(ymax, value);
             OutTextXY(0, 0, value); { максимум }
             str(xmax, value);
             OutTextXY(300, 191, value); { число }
             SetColor(3);
             for t := 1 to 19 do PutPixel(0, t*10, 1);
             Line(0, 190, 320, 190);
             SetColor(2);

           { вывод данных }
             for t := 1 to num do
              begin
                a := data[t]-ymin;
                a := a*norm;
                y := trunc(s);
                incr := 300 div xmax;
                  x := ((t-1)*incr)+20;
                  PutPixel(x, 190-y, 2);
               end;
             end; { конец процедуры вывода точечного графика}

     В процедуре "BarPlot" минимальное  и  максимальное  значение
вычисляется внутри процедуры.  В отличие от этой процедуры в про-
цедуре "ScatterPlon" не делается этих вычислений, а минимальное и
максимальное  значения передаются самой процедуре.  Это позволяет
выводить сразу несколько графиков на  один  экран  без  изменения
масштаба, накладывая таким образом один график на другой.

 
« Предыдущая статья   Следующая статья »