Графика в
MS-Фортране и ”C “
Обзор
графики и систематизация имен графических функций для DOS, WINDOWS
Большая
часть информации идет через глаза, вот почему так популярны: IBM-PC с дисплеем и WINDOWS с графическим интерфейсом (в DOS-текстовый режим).
Чем
мельче точки и чем чаще они расположены, тем качественнее изображение в ряду
дисплеев TV, CGA, EGA, VGA, SVGA.. Цветную точку изображения называют
"пиксель" = pixel = pic + cel = picture
cell.
Раскраска
миллиона точек экрана – это кропотливое
занятие; оно облегчается пакетом низкоуровневой графики MS. Изображение строится не только из
пикселей, но и из более крупных элементов. Библиотека графики годится для
"C" и для Фортрана, для
ДОС и для WINDOWS, она снабжена интерфейсами для этих языков.
|
DOS
|
WINDOWS
|
Библиотека функций графики
|
graphics.lib
|
LLibfew.lib
|
|
Интерфейсы графики
подключают первым оператором …
include 'Fgraph.fi'
интерфейсы графики
|
|
Описания и определения графики -первый оператор после заголовка
ПЕ
|
include 'Fgraph.fd'
|
Use MSFlib
модуль графики для любой ПЕ
тут же и интерфейсы графики
|
|
|
следует выбирать тип
проекта Quick Win.
|
Библиотека графики содержит около сотни функций,
имеющих пугающе длинные имена. Секрет прост - имена состоят из 2-3 английских
слов, образующих предложение в повелительном наклонении. Это предложение дает
команду, поясняя выполняемое действие, например,
call SetTextPosition(..) или менее выразительно call settextposition(..)
означает "установить текстовую позицию".
Первое слово - это действие, а последнее
- дополнение, поясняющие назначение
подпрограммы. Второе слово, если оно
есть, является определением к дополнению, а, если его нет, то это
что-то подразумеваемое по умолчанию.
Имена некоторых функций могут содержать окончание "_W" - от английского world, указывающего на использование мировых координат. Перечисленные ниже функции
классифицированы по действиям, определениям,
назначению и окончанию. Если в колонке перечислено несколько слов, то
возможно любое сочетание с другими колонками. Это упрощает понимание назначение
функций графики, так как в помощи по Фортрану выполнена лишь классификация
полных имен. Параметры функций, используемые константы (тоже с длинными
именами, поясняющее их смысл), возвращаемое значение, используемые структуры
- все это поясняется в помощи для DOS, вызываемой по QH или резидентно по "H". Помощь в Windows
в FPS4.0 – обычная: либо контекстная, либо по оглавлению, либо через поиск.
Конфигурация,
режимы и фонты
Конфигурация определяется не только дисплеем, но и
адаптером, установленным внутри
системного блока. Тип адаптера CGA,
EGA, VGA, SVGA - это набор
предельных возможностей аппаратуры: по числу пикселей в строке и столбце, по
числу символов в строке и столбце, по числу цветов, по объему видеопамяти, по
числу сменяемых видеостраниц.
Работа с экраном принципиально различается в DOS и WINDOWS.
Все начинается с того, что в DOS
основной режим - текстовый, а в WINDOWS основной режим – графический.Задавая режим, аппаратуру переключают на работу
только с символами (текстовый режим) или на работу с пикселями и символами
(графический режим). Внутри каждой из двух групп режимов есть много вариантов,
регулирующих использование цветов, высоту символов текста, число страниц видеопамяти
и т.д. Весь набор возможностей задается одной константой, а полученная
конфигурация может быть опрошена и записана в структуру /VDC/.
Фонт-это набор маленьких прямоугольных картинок, по
одной на каждый символ. Каждый фонт хранится в виде отдельного файла.
Фонты различаются не только по высоте, но и по стилю написания букв. Для
текстовых фонтов высота картинки фиксируется при задании режима, а для
графических - может гибко изменяться. При выводе символы адресуются в
матрице символов
- при выводе надписей текстовыми фонтами по call OutText('надпись') надписи позиционируются
с точностью до символа в строке и колонке
- при выводе надписей графическими фонтами по call OutGText( 'надпись' ) - надписи позиционируются с точностью
до пикселя.
действие
|
по определению и назначению
|
Пояснения
|
d2=get =>
d2=set=>
|
Video
Config (.. )
|
опрос видеоконфигурации
установка видеоконфигурации
|
call
get=>
d2=set=>
|
Video Mode ( .. )
|
опрос видеорежима
установка видеорежима
|
D2=register=>
|
Fonts ( .. )
|
регистрация группы фонтов
|
d2=set =>
call get=>
|
Font
( .. )
|
установка конкретного фонта
опрос фонта
|
call get=>
d2=set=>
|
Visual Page( .. )
Active Page( .. )
|
видимая страница
активная страница
|
Системы
координат
Экран
предоставляется программисту в двух видах:
- как прямоугольная матрица из цветных символов,
адресуемых по номеру строки и номеру столбца, начиная с (1,1);
- в графическом режиме как прямоугольная матрица из
пикселей, адресуемых по номеру строки и номеру столбца, начиная с (0,0); и как
матрица символов подобно текстовому режиму.
Размеры
матриц при работе в DOS
увеличиваются в порядке перечисления
адаптеров CGA, EGA, VGA, SVGA-их
можно опросить и установить по
режиму, задаваемому константой из 'Fgraph.FD. В отличие от этого при работе в WINDOWS программист
сам устанавливает любые виртуальные
размеры матрицы только в связи с размерностью задачи. В WINDOWS автоматически обеспечиваются полосы прокрутки, чего нет в DOS.
В зависимости от режима и потребностей задачи для
адресации отдельных элементов можно использовать 4 системы координат.
|
Физические
|
портовые
|
мировые
|
Текстовые
|
Текстовый режим
|
Нет
|
нет
|
нет
|
Да
|
Графический режим
|
Да
|
да
|
да
|
Да
|
что адресуем и
точка отсчета
|
координаты пикселей,
с (0,0) -верхний левый угол экрана
|
координаты пикселей,
с (0,0) - верхний левый угол порта
|
обычные декартовы
координаты точек по заданному размаху
|
Координаты cимволов, с (1,1) - верхний левый угол экрана
|
Structure и ее поля
Xcoord и yCoord
|
/pxyCoord/ integer*2
|
/xyCoord/ integer*2
|
/wxyCoord/ real*8
|
/rcCoord/ integer*2 row,col
|
Абсолютные или
относительные
|
Абсолютные
|
относительные
|
относительные
|
Абсолютные
|
Пользуясь этими структурами данных, окрашивают
"миллион" точек экрана, создавая высококачественное изображение.
Мировые (декартовы) координаты автоматически пересчитываются в физические
координаты пикселей по заданному размаху аргумента и функции.
По действиям
|
по определению и назначению
|
по окончанию
|
Пояснения
|
d2=set
|
WINDOW(.. )
|
|
Размах мировых координат
|
call set
|
View Port ( .. )
|
|
порт вывода внутри экрана
( до этого - весь экран)
|
call get
|
ViewCoord (..)
PhysCoord (..)
WindowCoord (..)
|
_w мировые
поумолч.-физические
относит.
|
Преобразование координат из
указанной назначением и окончанием в указанные определением
|
call сlear
|
Screen(..)
|
|
Параметр $GсlearScreen $GViewPort
( и пр.) - что стирать
|
Атрибуты
изображения
К основным
атрибутам элемента изображения относят: цвет, фон и позицию, заданную в одной
из 4 возможных систем координат. Для элементов, более сложных, чем отдельный пиксель,
адресуют левый верхний угол описанного прямоугольника. Атрибуты текстового и
графического изображения независимы.
Действие
|
по определениям
|
по назначению
|
По окончанию
|
Пояснения
|
d2=get
d2=set
|
Text
по умолч.- графическ.
|
Color (.. )
|
|
Цвет
|
d2=get
d2=set
|
Bk
|
Color (.. )
|
|
цвет фона для текста
|
d2=get
d2=set
|
графическ.
|
Pixel(..)
|
_w - мировые
по умолч.-физические
относит.
|
цвет отдельного пикселя
|
call get
d2=set
|
Text
|
Position(..)
|
|
опрос текстовой позиции
установка позиции
|
call get
|
Current - графическ.
|
Position(..)
|
_w - мировые
по умолч.-физические
относит.
|
опрос текущей графической позиции
|
Упомянем о
том, что контроля параметров, к сожалению, нет !
Рисование
линий и фигур, заполнение внутренности замкнутых фигур
До
установки масок идет рисование линий и заполнение внутренностей сплошь. Можно
установить маску для пунктирных линий
по call Set Line Style(..) Можно установить маску заполнения внутренности
(типа зебра, шахматы..) по call setFillMask(..) В параметрах функции верхний левый и нижний правый
углы описанного прямоугольника указывают место и размер фигуры, а
управляющий параметр задает режим рисования бордюра
фигуры либо их заполнение.
По действию
|
по окончанию
|
управляющий параметр
|
Пояснения
|
Call Move to(..)
|
_W мировые
по умолч.-физические
|
|
перемещение в
указанную позицию без рисования
|
d2=Line to ( .. )
|
_W мировые
по умолч.-физические
|
|
рисовать отрезок
прямой линии до указанной позиции
|
d2=Rectangle(..)
|
_W мировые
по умолч.-физические
|
$gBorder- бордюр
$gFilliterior
-
заполнение внутри фигуры
|
рисовать прямогольник в указанной позиции
|
d2=Ellipse(..)
|
_W мировые
по умолч.-физические
|
$gBorder -бордюр
$gFillinterior
-
заполнение внутри фигуры
|
рисовать эллипс в
указанной позиции
|
d2=Pie(..)
|
_W мировые
по умолч.-физические
|
$gBorder -бордюр
$gFillinterior
-
заполнение внутри фигуры
|
рисовать сектор в
указанной позиции
|
d2=Imageize(..)
call getImage(..)
call putImage(..)
|
_W мировые
по умолч.-физические
|
|
оценить размер
получить образ
скопировать образ
|
d2=FloodFill(..)
|
|
|
заполнение
внутренности замкнутой фигуры от точки внутри нее
|
В каталогах Фортрана
\SOURCE\SAMPLES имеется много
небольших поучительных примеров, иллюстрирующих применение графики. Примеры хорошо
прокомментированы; их можно скомпилировать и наглядно увидеть результат
выполнения.
Пример - График функции sin(x) в отраженных
зеркалах
Проиллюстрируем применение пакета, рисуя график функции sin(x) в окне все
меньшего и меньшего размера.
include ' FGRAPH.FI ' ! интерфейсы для графики ДОС – нет для Windows
program PROsinus
Use MSFlib
! все описания
структур, констант и типов для графики для Windows
include 'FGRAPH.FD' ! все описания структур, констант и типов для
графики для ДОС
real *8 PI,wx,wy
parameter
(PI=3.14159)
record /videoconfig/ vdc
record /xycoord/ xy2
record /wxycoord/ wxy8
record /rccoord/ cursor
integer*2 color, d2, m, kst, km
open(3,file='print.out')
! для
Windows основной режим уже графический
!– весь пролог,
что мелким шрифтом можно опустить
! для
dos основной режим текстовый, а потому
! весь пролог мелким шрифтом, обязательно нужен
call getvideoconfig(vdc) ! опрос адаптера
write(3,*) '
START: adapter '
write(3,*) 'vdc.adapter =', vdc.adapter
write(3,*) 'vdc.numtextrows =', vdc.numtextrows
write(3,*) 'vdc.numtextcols =', vdc.numtextcols
select case (vdc.adapter) ! выбор
графического режима для ДОС
case( $CGA )
d2=setvideomode(
$MRES4COLOR )
case( $EGA )
d2=setvideomode(
$ERESCOLOR )
case( $VGA )
d2=setvideomode(
$VRES16COLOR )
case DEFAULT
write(3,*) '
DEFAULT: нет адаптера '
stop 'ОТСУТСТВУЕТ ВИДЕОРЕЖИМ'
end select
call getvideoconfig(vdc) ! еще опрос адаптера
write(3,*) ' SELECTED: videomode: '
write(3,*) 'vdc.adapter =', vdc.adapter
write(3,*) 'vdc.numtextrows =', vdc.numtextrows
write(3,*) 'vdc.numtextcols
=', vdc.numtextcols
write(3,*) 'vdc.numXpixels =', vdc.numXpixels
write(3,*) 'vdc.numYpixels =', vdc.numYpixels
!!! РЕГИСТРАЦИЯ графических шрифтов
77 if( registerfonts('*.fon').lt.0)stop ‘нет ШРИФТ-ФАЙЛа *.fon'
d2 = setfont("t'Courier'h14w8b") ! текущий шрифт
!- мировые
координаты по размаху аргумента и функции
d2 = setwindow(.TRUE., -PI,-1.5d0,
+PI,+1.5d0 )
d2 = setColor(3) ! голубой будет рамка
d2 = rectangle($GBorder, 5,5,(vdc.numXpixels-100), (vdc.numYpixels-100) )
DO kst. =1,4 !
сколько графиков : сначала 1, потом по <Enter> ..2, 3, 4
km = 2**(kst-1)
Do m=1,km ! цикл по масштабам
d2 = setColor(0) ! черным будет поле синусоиды
! порт вывода все
меньшего размера внутри экрана
call SetViewPort( 6,6, (vdc.numXpixels-101)/km,
(vdc.numYpixels-101)/km )
call ClearScreen($GViewPort)
d2 = setColor(14) ! желтым будет график
call Moveto_w(-PI,0, wxy8) ! начало графика
do wx= -PI,+PI, PI/8 ! ломаная линия
wy = sin( real(wx) )
d2 = lineto_w( wx,wy ) !
отрезок до следующей точки
графика
enddo ! wx= -PI,+PI, PI/8
call GetViewCoord_w(0.d0,0.d0,xy2) ! начало координат (0,0)
d2=setColor(12) ! красным будет (0,0)
d2=rectangle($GfilliInterior,
xy2.Xcoord-1,xy2.Ycoord-1, xy2.Xcoord+1,xy2.Ycoord+1)
call outGtext('(0,0)'
)
d2 = setColor(2) ! оси координат - зеленые
call Moveto_w( -PI,
0.d0, wxy8) ! ось X
d2 = lineto_w( +PI,
0.d0 )
call Moveto_w(0.d0,1.5d0,wxy8)
! ось Y
d2 = lineto_w(
0.d0,-1.5d0 )
enddo ! m=1,km
! конец цикла по масштабам
call SetTextPosition(vdc.numTextRows-3,5,cursor) ! снизу 3-я строка
d2 = settextColor(12) ! красным будет
цвет текста
call outtext( ' жми ENTER' )
read(*,*)
END DO ! конец цикла по
графикам
d2=setvideomode( $Defaultmode
) !
вернуть обычный режим ОС
end
В рассмотренном примере использованы
структуры, подпрограммы и функции графики, выделенные в тексте программы жирным
шрифтом. Их подробное описание (как и всех других функций из пакета графики)
имеется в помощи по Фортрану
- для DOS в
H и QH и в документации
- для Windows – контекстная по F1 или графика-по
содержанию