10949-1 (607670), страница 2
Текст из файла (страница 2)
Оконные координаты.
Оконные координаты используются для масштабирования изображения. Они устанавливаются для текущего порта просмотра. Все функции работы с окнами оканчиваются символом “-w”. Значение оконных координат имеют не целочисленный тип Integer (как обычно), а вещественный тип Real*8.
Пример:
dum = SetWindow (.TRUE.,-200.,-56,3.,500.,400.) – установка оконных координат в текущем “порту просмотра”
.TRUE. – увеличение по оси ординат снизу вверх
.FALSE. – увеличение по оси ординат сверху вниз
| | На рисунке в круглых скобках ( ) показаны физические координаты, в квадратных [ ] оконные координаты. На каждый физический пиксель по ОХ приходится При нулевых размерах окна функция не выполняется. При успешном выполнении функция 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
Пример:
Dum = SetFont (“t‘Roman’h18”)
После выполнения функции setfont установленный шрифт становится текущим, т.е. он действует до тех пор, пока не будет установлен другой шрифт (либо не отменен видеорежим, либо не окончена программа). Текущим может быть только один шрифт. Параметры функции setfont задаются строкой символов, которые определяют желаемые характеристики выбранного шрифта. Порядок параметров не имеет значения.
| Параметр | Значение |
| t’fontname’ hy wx f p v r b | Имя шрифта. В апострофах указывается одно из следующих: courier, helv, tms rmn, modern, script, roman, helv Cyrillic Высота символов пикселях (у) Ширина символов пикселях (х) Выбор фиксированного шрифта Выбор пропорционального шрифта Выбор векторного шрифта Выбор битового шрифта Выбор наиболее подходящего шрифта |
Функция setfont при успешном выполнении возвращает 0, иначе – 1.
Приоритет параметров при выборе шрифта
высота
начертание (f/p)
ширина
разрядка (v/r).
Отображение текста.
Для написания текста текущим шрифтом необходимо:
установить координату вывода текста п/п move to – см. выше
передать текст на экран с помощью процедуры OutGText.
Пример:
Call MoveTo (50,60,xy)
Call OutGText (‘Minsk, 2001’)
После выполнения п/п outgtext текущая графическая позиция изменяется. Отметим, что данная п/п не обеспечивает возможность форматирования текста, то есть для вывода целых или вещественных значений сначала необходимо их преобразование в строку (символьную константу или т. н. внутренний файл) с помощью оператора write.
Character *12 val
……………………
call moveto (xdin + 5, posy, xy)
call outgtext (‘E=’)
write (val,’(f12.2\)’)E
call outgtext (val) ! вывод значения
call outgtext (' MPa')
Определение параметров установленного шрифта можно осуществить функцией GetFontInfo, которая возвращает характеристики шрифта в виде структуры fontinfo, определенной в файле fgraph.fd.
Пример:
RECORD /fontinfo/fi
………………………
dum = GetFontInfo (fi)
write (5,*)’ Путь к файлу шрифта –‘,fi.filename
Элементы структуры fontinfo:
t
ype – тип шрифта: 1-векторный, 0-битовый
ascent – размещение от верхней базовой линии пиксела
Integer*2 pixwidth –ширина символов в пикселях (0-пропорциональный шрифт)
pixheight - высота символов в пикселях (0-пропорциональный шрифт)
avgvidth – средняя ширина символов в пикселях
filename – имя файла с путем доступа















