Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности

Гостевая книга

От автора

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

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

                  ¦                   ¦
                  ¦          ++       ¦
                  ¦    ++    ¦¦       ¦
                  ¦ ++ ¦¦    ¦¦       ¦
                  ¦ ¦¦ ¦¦ ++ ¦¦       ¦
                  ¦ ¦¦ ¦¦ ¦¦ ¦¦       ¦
                  +----------------   +-----------------
                  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" не делается этих вычислений, а минимальное и
         максимальное  значения передаются самой процедуре.  Это позволяет
         выводить сразу несколько графиков на  один  экран  без  изменения
         масштаба, накладывая таким образом один график на другой.

(с)Все права защищены

По всем интересующим вопросампрошу писать на электронный адрес

    Rambler's Top100 PROext: Top 1000
    Rambler's Top100 Яндекс цитирования
Hosted by uCoz