TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

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

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

FAQ

Ссылки

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

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

Спонсор

От автора

 

         Практическое задание N 2. 1

            1.  Задать графическое окно с началом в центре экрана.  Для драйвера VGA в режимах 0,  1,  2  при  k=1  и  k = xx/yy выполнить следующие действия. 

            1. 1.  Процедурой Circle(x, y, r); нарисовать окружность радиусом 50 с центром в начале координат.  Процедурой Line(x1, y1, x2, y2); нарисовать квадрат,  описанный вокруг окружности.  Очистить графическое окно. 

            1. 2.  Процедурой Rectangle(x1, y1, x2, y2); нарисовать квадрат со стороной 100 с центром в начале координат.  Процедурой Line(xi, yi, xj, yj); нарисовать окруж-ность (в виде многоугольника),  вписанную в квадрат.  Очистить графическое окно.

            Примечание.  Вывести надпись - номер режима и значение k.  При k=1 и режимах 0,  1  окружность не будет вписанной в квадрат. 

 

            Построение графика функции Y = F(x) с масштабированием по осям координат.

            При построении графиков функций на экране монитора необходимо преобразовывать расчетные координаты в графические с соблюдением определенных пропорций,  а также предусмотреть возможность масштабирования графика по осям координат.  Это вызывает необходимость создания специального алгоритма и процедур,  обеспечивающих универсальность программирования графических изображений.  Ниже приводится алгоритм построения графиков в правой системе координат,  расположенной в заданной области экрана,  с возможностью автоматического масштабирования. 

   0            left              right       XG                          Пусть задана непрерывная функция F(x) 

                                                                             в диапазоне изменения аргумента x=[A. . B].

  up                     y                                             

                                                                                 Требуется построить по N точкам график

                                                                               функции Y=F(x) в прямоугольной области

                       A    0      B   x                                     экрана  left,  up,  right,  down.    

  down

                                                                                  0  £  left,  right   £  GetMaxX

   YG                                                                         0  £  up,   down  £  GetMaxY                 

                                                                         

            Алгоритм  построения графика функции Y=F(x).

            1).  Определяем массивы значений аргумента и функции: x[i], Y[i]=F(x[i]),  где i= 1. . . N.  При равномерном разбиении интервала [A. . B] массивы можно задавать операторами:

                                 Dx:= (B-A)/(N-1);                        { шаг разбиения по "х" }

for i:= 1 to N do  begin

                   x[i]:= A + round(Dx*(i-1));   Y[i]:= F(x[i])    end;

            2).  Определяем наибольшее (Y_MAX) и наименьшее (Y_MIN) значения функции в заданном интервале изменения аргумента:

              Y_MAX:= Y[1];   Y_MIN:= Y[1];

for i:= 1 to N do  begin

              IF Y_MAX < Y[i] THEN  Y_MAX:= Y[i];

              IF Y_MIN > Y[i] THEN  Y_MIN:= Y[i]     end;

            В случае явного задания функции, для аргумента "х"  имеем наибольшее значение  X_MAX:= B  и наименьшее значение  X_MIN:= A. 

Наибольшее и наименьшее значения функции и аргумента необходимы для полного размещения графика в расчетной области.  Эти значения можно изменять с целью уменьшения размеров графика или увеличения его отдельных частей.

 

            3).  Определяем коэффициенты масштабирования при построении графика в заданной области экрана:

              Kx:= (right-left)/(X_MAX - X_MIN);

              Ky:= (down - up )/(Y_MAX - Y_MIN);

 

            Если параметры функции "х" и "y" имеют одинаковую размерность или оба безразмерны,  то может появиться искажение естественной формы кривой вследствие разного масштабирования по осям координат: чрезмерное растяжение/сжатие по одной из осей.  Например,  при рисовании по точкам вместо окружности будет нарисован эллипс.  Кроме этого следует учитывать искажение формы графика,  регулируемое параметрами процедуры GetAspectRatio(xx, yy).  Для вывода графика без искажения формы кривой следует переназначить координаты области экрана так,  чтобы получить Ky=K*Kx,  где K=xx/yy.

                   XG

 

 

 

 YG

Операторы для автоматического масштабирования приведены ниже в модуле GR_F  для различных случаев,  определяемых значением параметра  “pr”.

            1:  pr = 1.  Пусть заданы нижняя,  верхняя и левая границы области построения графика:  down,  up,  left.  Необходимо найти значение right при условиях:  Ky = K * Kx и right<=GetMaxX.  Если условие ограничения графика по длине экрана не выполняется,  то полагается right:=GetMaxX;  и значение "up" корректируется (уменьшается).

                   XG

 

 


 

 YG

            2:  pr = 2.   Пусть заданы левая,  правая и нижняя границы области построения графика:  left,  right,  down.  Необходимо найти значение up при условиях:  Kx = Ky / K и up>=0.  Если условие ограничения графика по высоте экрана не выполняется,  то полагается  up:=0;  и значение "right" корректируется (уменьшается).

            4).  Строим оси координат (начало координат  x = 0,  y = 0 ).

            5).  Строим график в виде последовательных отрезков используя аналоги графических процедур BGI:

                                moveto_G(x[1],  y[1]);

               for i:=2 to N do lineto_G(x[i],  y[i]);

 

            Ниже приводятся операторы модуля GR_F,  наращивая который аналогами графических процедур BGI можно строить графики в расчетной области.

Unit GR_F;                                                                                                {  модуль GR_F }

{$N+}                                                                           {подключение сопроцессора}

 

INTERFACE

Var right, left, down, up: integer;  k_xy,  kx, ky, X_max, X_min, Y_max, Y_min: double;                  {  описание глобальных переменных }

procedure mash( c, c1,   pr:word);                           { c - номер цвета линий}

procedure oci;                                                                            { c1 - номер цвета фона }

procedure Lineto_G(x1, y1:double); { аналог графической процедуры  Lineto}

IMPLEMENTATION

Uses Graph;

PROCEDURE mash;

Var xx, yy: word; xg_m,  yg_m:integer;

Begin  xg_M:=GetMaxX; yg_M:=GetMaxY;

{----- ввести операторы контроля заданных значений глобальных переменных ----}

{ X_min < X_max;      0 <left< right <xg_M;      Y_min < Y_max;       0 <down <up <yg_M }

         GetAspectRatio(xx, yy);   k_xy:=xx/yy;

    ky:=(down-up)/(Y_max-Y_min);   kx:=(right-left)/(X_Max-X_min);

  case pr of                            { pr - признак построения графиков }    

  1:  begin kx:=ky/k_xy;         {pr=1 - без искажения формы,  меняя Right}   

      right:= left + Round(kx*(X_max- X_min));

      if right>GetMaxX then begin right:=GetMaxX;

                   kx:=(right-left)/(X_Max-X_min);   ky:=kx*k_xy;

                   up:=down - Round(ky*(Y_max - Y_min)); end; end;

  2:  begin  ky:=kx*k_xy;          {pr=2 - без искажения формы,  меняя Up}           

      up:= down - Round(ky*(Y_max- Y_min));

      if up<0 then begin up:=0;

                    ky:=(down-up)/(Y_max-Y_min);      kx:=ky/k_xy;

                 right:=left+Round(kx*(X_max-X_min)); end; end;

  end;                                       {pr=0 - в заданной области}   

  Setcolor(c);  SetFillStyle(1,c1);    bar(left, up, right, down);

End;

PROCEDURE oci;         { оси координат строятся только в пределах заданной области}

Var xg0, yg0:integer;

Begin           XG0:=left - round( kx*X_min);

                YG0:=down + round( ky*Y_min);

   if X_MIN*X_MAX <=0  then  line(XG0,  up,  XG0,  down);

   if Y_MIN*Y_MAX <=0  then  line(LEFT, YG0, RIGHT,  YG0);

End;

PROCEDURE Lineto_G;               {рисование линии из текущей позиции курсора}

Var xg1, yg1:integer;                                         {т. 1 -  конец линии}

Begin

    xg1:= left + Round(kx*(x1- X_min));

    yg1:= down - Round(ky*(y1- Y_min));      lineto(xg1, yg1);

End;

BEGIN

END.

            Приведенное описание размещения графика в прямоугольной области экрана позволяет: выводить кривые по точкам с отрицательными значениями координат,  масштабировать график (сжимать/растягивать),  изменять цвет фона внутри прямоугольника,  задаваемого процедурой  Bar(left, up, right, down). 

            Доработать методику для совместного построения нескольких графиков несложно.  Необходимо для всех функций определить дискретные координаты y[i] и найти наибольшее и наименьшее значения для всех функций в заданных диапазонах изменения аргументов.  Наибольшим значениям присвоить Y_MAX  и  X_MAX,  а наименьшим - Y_MIN  и  X_MIN.  Затем определить область для построения графика и координаты точек кривых.  Кривые для разных функций желательно рисовать разным цветом с указанием вида функции.

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

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

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

Hosted by uCoz