1.22.3. Подпрограммы библиотеки DFLIB для рисования графических примитивов

Графическими примитивами называют точки, отрезки прямых, прямоугольники, окружности и ряд других. Перечень некоторых примитивов библиотеки DFLIB приведен в таблице. При работе с графикой вводится понятие текущей позиции (точки, пикселя). После перехода в графический режим текущая позиция задается в центре активного окна. Изменение текущей позиции выполняется подпрограммами

Закрыть

Таблица. Подпрограммы изображения графических примитивов

Видовые (экранные)

координаты

Математические

(оконные) координаты

Изображаемый графический объект

1

SETPIXELS

SETPIXEL_W

Пиксель

2

SETPIXELRGB

SETPIXELRGB_W

Окрашенный пиксель

3

LINETO

LINETO_W

Отрезок прямой

4

RECTANGLE

RECTANGLE_W

Прямоугольник

5

POLYGON

POLYGON_W

Многоугольник

6

ELLIPSE

ELLIPSE_W

Эллипс или окружность

7

ARC

ARC_W

Дуга окружности

8

PIE

PIE_W

Сектор окружности

9

FLOODFILL

FLOODFILL_W

Заполнение замкнутой области цветом

Функции, имена которых оканчиваются на W, предназначены для рисования в математической (оконной) системе координат. Текущий цвет графических примитивов устанавливается с помощью функций SETCOLORGB и SETCOLOR.

CALL MOVETO(X,Y,COORD)

или

CALL MOVETO_W(WX,WY,W_COORD)

Параметры процедур:

X,Y – типа INTEGER(2) – видовые (экранные) координаты пикселя, в который перемещается текущая позиция,

WX, WY – типа REAL(8) – оконные (математические) координаты точки, которая становится текущей n.

Параметры COORD и W_COORD являются переменными производного типа, определяемого в библиотеке DFLIB. Значения этих параметров задают видовые и оконные координаты предшествующей позиции.

Закрыть

Переменная COORD имеет тип xycoord:

TYPE xycoord

INTEGER(2) xcoord

INTEFER(2) ycoord

END TYPE xycoord

 

Переменная W_COORD имеет тип wxycoord:

TYPE wxycoord

REAL(8) wx

REAL(8) wy

END TYPE wxycoord

Для описания переменных этого типа в программе используются операторы

TYPE(xycoord)COORD и TYPE(wxycoord) COORD_W.

 

Обращение к процедурам CALL MOVETO и CALL MOVETO_W, т.е. изменение текущей позиции, не приводит к изменению изображения.

Цвет пикселя на экране можно изменить, обратившись к функциям

SL2=SETPIXEL(X,Y) ,

SL2=SETPIXEL_W(WX,WY)

Функции возвращают значение типа INTEGER(2), равное номеру цвета, которым был закрашен пиксель до обращения к функциям, или –1, если задаваемые при обращении координаты выводят за область текущего окна. Номер цвета, в который окрашивается пиксель, задается функцией SETCOLOR.

ПРИМЕР: Построить графики двух функций

 , , ,

и

, .

РЕШЕНИЕ. Будем изображать два графика в окне голубого цвета, расположенном в левом верхнем углу экрана, зеленым и желтым цветом. Оси координат для этого окна нарисуем белым цветом; начало координат в точке (a, b). Третий график изобразим черным пером отдельно в окне желтого цвета, расположенном правее первого окна. Изучите текст программы, реализующей данный пример, и выполните следующее задание.

ЗАДАНИЕ:

1) Пронаблюдайте работу программы(1_GR_MIN).

2) Модифицируйте  программу, так чтобы получившаяся программа во втором окне рисовала оси координат синим цветом и, дополнительно, еще один график функции - красным цветом. .

Для более подробного ознакомления с выводом данных в графическом формате мы рекомендуем книгу [Бартеньев О. В. Visual Fortran: Новые возможности].

Закрыть

PROGRAM GRAPH

USE DFLIB

REAL(8), PARAMETER :: A=-3.0D0, B=3.0D0, &

  C=-8.0D0, D=8.0D0,      &

  A1=-5D0,B1=5D0,C1=-8D0,D1=8D0

INTEGER(2)  SL2

INTEGER(4) SL4

REAL(8) X, Y, H, H1, Y1

INTEGER(2),PARAMETER :: DXL=30,DYL=20, ML=3, M=400

LOGICAL(2) :: FINF=.TRUE._2

TYPE(WXYCOORD)WXY

TYPE (WINDOWCONFIG)WC

            SL4=GETWINDOWCONFIG(WC)

            LX=WC.NUMXPIXELS

            LY=WC.NUMYPIXELS

            CALL SETVIEWPORT(DXL,DYL,DXL+LX/ML,DYL+LY/ML)

            SL2=SETWINDOW(FINF,A-0.2*(B-A),D,B,C-0.2*(D-C))

            SL4=SETBKCOLORRGB(#D01F01)

            CALL CLEARSCREEN($GVIEWPORT)

            CALL MOVETO_W(A-0.2*(B-A),C,WXY)

            SL2=SETCOLOR(15_2)

            SL2=LINETO_W(B,C)

            CALL MOVETO_W(A,C-0.2*(D-C),WXY)

            SL2=LINETO_W(A,D)

            DO X=A+1,B-1,1

             CALL MOVETO_W(X,C,WXY)

             SL2=LINETO_W(X,C+0.05*(D-C))

            END DO

            H=(B-A)/M

            X=A

            Y=DSIN(4*X)+X*LOG(X*X+1)

            Y1=0.2*X**4

           

            CALL MOVETO_W(X,Y,WXY)

            DO   WHILE(X<=B)

                SL2=SETCOLOR(14_2)

                        SL2=SETPIXEL_W(X,Y1)

                        CALL MOVETO_W(X,Y,WXY)

                        X=X+H

                        Y=DSIN(4*X)+X*LOG(X*X+1)

                        SL2=SETCOLOR(10_2)

                        SL2= LINETO_W(X,Y)

                        Y1=0.5*X**2

                        CALL SLEEPQQ(10)

            END DO

            CALL SETVIEWPORT(2*DXL+LX/ML,DYL,2*DXL+2*LX/ML,DYL+LY/ML)

 

            SL2=SETWINDOW(FINF,A1,D1,B1,C1)

            SL4=SETBKCOLORRGB(#00FFFF)

            CALL CLEARSCREEN($GVIEWPORT)

            SL2=SETCOLOR(0_2)

            H1=(B1-A1)/M

            X=A1

            Y=DSIN(4*X)*DCOS(7*X*X)

            CALL MOVETO_W(X,Y,WXY)

            DO   WHILE(X<=B1-H1)

 

                        SL2=LINETO_W(X,Y)

                        Y=DSIN(X)*DCOS(2*X*X)*X+0.5*X

                        X=X+H1

                        CALL SLEEPQQ(10)

            END DO

 STOP

 END