Смекни!
smekni.com

Графическое программирование на Ms Fortran (стр. 2 из 4)

10, 50–координаты начала текста; rc – локальное имя структуры rccoord (см. fgraph.fd) с помощью которой возвращается и передается в п/п предыдущая текстовая координата для ее переразмещения в новую. Координата (1,1) находится в левом верхнем углу.

Физические координаты.

Физические координаты являются фиксированными и определяются техническими средствами (видеокартой и монитором).Начало координат находится в левом верхнем углу, если не используется п/п setvieworg. Разрешения 640*480; 800*600. Физические координаты являются целочисленными.

Пример: перенос начала координат в точку (50, 100)

CALL setvieworg (50, 100, xy)

Теперь координата x изменяется от 50, до .numxpixels-50, а y, от 100 до .numypixels-100, где numxpixels и numypixels – элементы структуры videoconfig, содержащие максимальное число пиксел по осям OX и OY. Переустановка начала координат повлияет на все графические процедуры.

Используя физические координаты можно установить невидимую координатную область ‑ “область клипа”. Рисование в этом случае производится только в этой области, попытка рисования вне области игнорируется.

Пример:

call setcliprgn (10,10,100,100) – установка квадратной “области клипа”. Процедура setcliprgn не изменяет систему координат.

3.3.3 Координаты порта просмотра

“Порт просмотра” (“viewport”) – прямоугольная область экрана в которой осуществляется рисование. “Порт просмотра” устанавливается процедурой setviewport. Действие этой процедуры аналогично процедуре setcliprgn, но с переносом начала координат в левый верхний угол области. При использовании “оконных” координат необходимо создать "порт просмотра”.

Пример:

Call SetViewPort(20,20,200,200)

Аналогично:

Call SetClipRgn(20,20,200,200)

Call SetViewOrg(20,20)

Оконные координаты.

Оконные координаты используются для масштабирования изображения. Они устанавливаются для текущего порта просмотра. Все функции работы с окнами оканчиваются символом “-w”. Значение оконных координат имеют не целочисленный тип Integer (как обычно), а вещественный тип Real*8.

Пример:

dum = SetWindow (.TRUE.,-200.,-56,3.,500.,400.) – установка оконных координат в текущем “порту просмотра”

.TRUE. – увеличение по оси ординат снизу вверх

.FALSE. – увеличение по оси ординат сверху вниз

На рисунке в круглых скобках ( ) показаны физические координаты, в квадратных [ ] оконные координаты. На каждый физический пиксель по ОХ приходится
оконных пикселя и по OY 1.91. При нулевых размерах окна функция не выполняется. При успешном выполнении функция setwindow возвращает ненулевое значение.

Пример работы с координатными системами. Приведены стандартная головная программа и п/п.

$DEBUG ! Производит дополнительные проверки при компиляции

include 'fgraph.fi' ! Включение интерфейсов графических

interface to function getch()

integer getch[C,alias:’_getch’]

end

program graph_examples

implicit NONE ! Запретить неявное объявление типов

integer *2 dum ! Фиктивная переменная

integer getch[EXTERN]

include 'fgraph.fd' ! Объявление типов графических функций

dum=setvideomode($MAXRESMODE) ! Установить видеорежим с максимальным разрешением

call graph_win()

dum=getch() ! Задержка до нажатия любой клавиши

dum=setvideomode($DEFAULTMODE) ! Установить предыдущий видеорежим

end

subroutine graph_win()

include 'fgraph.fd'

integer*2 dum

! DOUBLE PRECISION dg,dv,maxdim,xcen,ycen

real*4 dg,dv,maxdim,xcen,ycen

record /xycoord/xy

record /videoconfig/vc

! Перемещение начала координат в точку (50,100)

call setvieworg(50,100,xy)

! Рисование диагональной линии

call getvideoconfig(vc) ! определение видеоконфигурации

dum=setcolor(2)

call moveto(-50,-100,xy)

dum=lineto(vc.numxpixels-50,vc.numypixels-100)

read*

call setviewport(100,100,200,200) ! окно просмотра, координаты - физические

dum=floodfill(1,1,3) ! заполнение области (окна просмотра) текущим цветом

! при отсутствии окна просмотра заполняется весь экран

read*

! Рисование и масштабирование эллипса в квадратном окне просмотра

call clearscreen($gclearscreen)

write(5,*)'Введите диаметры эллипса по горизонтали и вертикали'

read(5,*)dg,dv

call setviewport(100,100,300,300) ! окно просмотра, координаты - физические

dum=rectangle($gborder,1,1,199,199) !рамка окна

maxdim=max(dg,dv) ! Максимальный габарит рисунка

dum=setwindow(.false.,0.,0.,maxdim,maxdim)

if(dum.eq.0) write(5,*)'Ошибка установки окна'

! Рисование, масштабирование эллипса и его центровка

xcen=0.5*(maxdim-dg)

ycen=0.5*(maxdim-dv)

dum=ellipse_w($gfillinterior,xcen,ycen,xcen+dg,ycen+dv)

end

На рисунке в круглых скобках ( ) показаны физические координаты, в квадратных [ ] координаты порта просмотра, в фигурных { } оконные координаты.

3.4. Установка атрибутов фигур.

Под атрибутами рисования понимается:

установка текущего фона рисования

установка текущего цвета рисования

установка текущего способа изображения линии (типа)

установка текущей маски заполнения цветом (штриховки)

Установка цвета фона с индексом 2:

dum = setbcolor (2). По умолчанию индекс 2 соответствует зеленому цвету.

Аналогично dum = SetBkColor ($green). $green – символическая константа, указанная в файле fgraph.fd.

Toже цвета рисования.

dum = setcolor (2)

В случае неуспешного выполнения возвращается значение -1.

Установка шаблона для рисования линии

Call SetLineStyle (center), где center – имя 16-ти битной переменной. Бит 1 указывает на рисование соответствующего пиксела текущим цветом, 0 на отсутствие изменений цвета соответствующего пиксела. Шаблон повторяется по всей длине линий.

Пример задания переменной center.

$NODEBUG

integer*2 center /2#1111111100011000/ ! штрихпунктирная линия –

$DEBUG

Установка шаблона штриховки.

Call SetFillMask (shad), где shad – 64-х битный массив 8*8 бит, где каждый бит представляет собой пиксел.

Пример задания shad:

$NODEBUG

integer*1 shading (8)/
> 2#00000001,
> 2#00000010,
> 2#00000100,
> 2#00001000,
> 2#00010000,
> 2#00100000,
> 2#01000000,
> 2#10000000/

$DEBUG

Создание и управление графическими объектами

4.1. Рисование графических примитивов

Рисование эллиптических дуг.

Функция аrc использует систему координат “порта просмотра”, функция arc_w использует систему ”оконных” координат. Центр дуги есть центр ограниченного прямоугольника. Dum = arc (x1, y1, x2, y2, x3, y3, x4, y4).

Очистка экрана.

П/п ClearScreen очищает область, заполняя ее текущим цветом фона.

Пример:

Call ClearScreen ($GCLEARSCREEN) – очистка всего экрана (заполнение его текущим цветом фона)

При символической константе $GVIEWPORT – очистка текущей области просмотра; $GWINDOW – очистка текущего окна.

Рисование эллипса

dum = ellipse ($GFILLINTERIOR, x1, y1, x2, y2) – рисование эллипса, закрашенного текущей маской заполнения. При использовании символической константы $GBORDER – рисуется контур эллипса, ellipse_w – тоже в “оконных” координатах.

Закрашивание замкнутой области.

dum = FloodFill (x, y, bnd) – закрашивание замкнутой области с точки (х,у) (не лежащей на контуре) текущим цветом. Bnd – индекс цвета ограничивающего контура. При достижении цвета bnd закрашивание в данном направлении заканчивается. При неуспешном выполнении возвращается нулевое значение.

Рисование линии.

Функция LineTo рисует линию с текущей позиции до заданной точки (х, y) в координатах порта просмотра. После успешного выполнения (возвращено ненулевое значение) текущая позиция устанавливается в точку (х, у). dum = LineTo (x, y)

Перемещение текущей позиции графического вывода в заданную точку (х1, у1)

Calll MoveTo (x1, y1, xy) – xy – локальное имя структуры xycoord, возвращающей координаты предыдущей позиции.

Рисование прямоугольника.

dum = Rectangle ($GFILLINGTERIOR, x1, y1, x2, y2)

При использовании $GBORDER рисуется только контур прямоугольника. Возвращается 0 только при возникновении ошибки.

Рисование точки.

dum = SetPixel (x, y), в случае ошибки возвращается – 1.

Пример см. на рисунке стр. 5

4.2. Отображение текста

Шрифты делятся на:

битовые – отображаются поточечно ‑ символ состоит из набора точек. Битовые шрифты имеют фиксированный размер и не масштабируются.

векторные – символ состоит из последовательных линий и дуг, его образующих. Векторные шрифты масштабируемы.

Данная ситуация аналогична форматам изображения.

точечному (растровому), состоящему из разноцветных точек (bmp).

векторному, состоящему из набора графических примитивов (wmf, dwg). Конвертация из растрового формата в векторный более сложна, чем наоборот, но возможна (например, с помощью программы RasterVect (htttp://www.rastervect.com))

Шрифты в MS Fortran:

Тип шрифта Отображение Размеры
Courier Helv Tms Rmn Modern Roman Битовый Битовый Битовый Векторный Векторный 10*8; 12*9; 15*12 10*5; 12*7; 15*8; 18*9; 22*12; 28*16 10*5; 12*6; 15*8; 16*9; 29*12; 26*16 масштабируемый масштабируемый

Для использования шрифтов необходимы следующие действия:

выбор (регистрация) шрифта

установка текущего шрифта из регистра

отображение текста текущим шрифтом

выгрузка шрифтов из памяти

4.2.1. Выбор шрифта

Процесс регистрации шрифта представляет собой загрузку в ОЗУ соответствующего .fon файла

Синтаксис: dum = RegisterFonts (filename), где: filename – имя fon файла с необязательным указанием пути доступа. Возможно использование подстановочных символов * и ?.

Пример:

Dum = RegisterFonts (‘C:\MSLIB\FONT\*.fon‘)

Вывести текст шрифтом может только функция outgtext. В случае ошибки возвращается следующее значения:

- 1 нет заданного файла или каталога

- 2 один или более FON файлов является двоичными

- 3 один или более FON файлов испорчены.

4.2.2. Установка шрифта

Установка шрифта производится функцией SetFont

Пример: