Реферат: Графическое программирование на Ms Fortran

Графическое программирование на MsFortran

Курс лекций по дисциплине  поспециальности «ПГС» после техникума

Факультет – строительный; кафедры –«Металлические и деревянные конструкции» и «Железобетонные и каменныеконструкции»

Задачи курса

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

Литература

1) Уорд Т.,Бромхед Э. Фортран и искусство программирования персональных ЭВМ. — М.: Радио исвязь, 1993.-352с.

2)Программирование на Фортране 77/ Дж. Ашкрофт, Р. Элдридж и др. — М.: Радио и связь,1990.-272с.

3) Бартеньев О.В.Фортран для студентов. — М.: «Диалог-МИФИ», 1999.-400с.

4) Рыжиков Ю.И.Программирование на Фортране Pоwer Statiоn для инженеров. Практич. рук-во. — СПб.: КОРОНАпринт, 1999.-160с.

5) Н.А Рак, В.ИСмех, С.Б. Щербак Программирование инженерных задач на FORTRANе: Уч. методич.пособие по дисц. «Выч. техн. и программир.» — Мн.: БГПА, 1998.-45с.

6) Соловьев П.В.FORTRAN для персонального компьютера: Справ. пособие. — М.: Арист, 1991.-224с.

7) Н.А Рак, В.ИСмех, С.Б. Щербак Графическое программирование: Уч. методич. пособие по дисц.«Выч. техн. и программир.» — Мн.: БГПА, 1997.-40с.

8) Бартеньев О.В.Графика OрenGL: программирование на Фортране. М.: ДИАЛОГ-МИФИ, 2000.-368с.

Этапы разработки графических программ

Для разработки графическихпрограмм на Fortran необходимо иметь в наличии библиотеки графическихпроцедур, содержащиеся в файле Graphics.lib.

Разработкаграфических программ состоит из следующих этапов:

Подключениеграфической библиотеки

Установка видеорежима

Установка средыизображения

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

Восстановлениепервоначальной конфигурации перед выходом из программы

Графическиепроцедуры представляют собой функции и подпрограммы. Каждая программа,использующая графическую библиотеку должна ЯВНО объявить процедуры. Отдельнуюиспользуемую графическую процедуру можно объявить, написав ее интерфейс (смотрисправку NORTON GUIDE). Сразу все графические процедуры можно описать, включив впрограмму файлы FGRAPH.FI и FGRAPH.FD. FGRAPH.FI – содержит объявление процедур в операторах INTERFACE (см.далее).

Оператор INTERFACEобъявляет имя процедуры (функции), ее атрибуты и типы формальных параметров.Оператор используется для обеспечения корректности вызовов п/п. Компиляторвыполняет проверку числа и типов параметров в вызове п/п с параметрами,указанными в интерфейсе.

Пример:

/>INTERFACE TO INTEGER FUNCTION Func (p, d, q)

Integer*2 p

Real d               типы параметров

Real*8q

END

где: INTEGER – типфункции; FUNCTION – функция; Func – имя функции; p, d, q – формальные параметры.

Здесь объявленацелая функция (возвращающая целое значение) Func с тремя входнымипараметрами p, d, q. Вызов данной функции обычен:

K =Func (p,d,q)

                                 INTERFACE TO ________________ SUBROUTINE Mix (a,b,c) – объявляет п/п (находится в библиотечном файле срасширением .LIB), находящейся в другом файле.

Вызов п/п обычен    CALL MIX (a,b,c)

Файл FGRAPH.FD содержитобъявления структурных и символических констант и объявлений операторов EXTERNAL дляграфических процедур.

     Пример, кодафайл FGRAPH.FD:

/>/>имя структуры

STRUCTURE/videoconfig/

/>/>Integer*2 numxpixels                      элементы структуры

а)               Integer*2 numypixels

/>……………………….       операторыобъявления типов и/или RECORD.

/>END STRUCTURE

б) INTEGER*2 setvideomode [extern]                               PARAMETER($YELLOW = #153f3f)

/>в)  EXTERNALgetvideoconfig                                            PARAMETER($BRIGHTWHITE = #3f3f3f)

г)  INTEGER*4$YELLOW,$BRIGHTWHITE

а) Определениесоставного типа переменной (структуры).

Обратиться кэлементу структуры (для присвоения или получения значения) можно следующимспособом:

                 X = videoconfig.numxpixels

/>


          имяструктуры    элемент структуры

Структуры могутвкладываться друг в друга с использованием оператора RECORD – объявляетструктуру для имен, определяемых пользователем.

Пример:

STRUCTURE /full_adress/                   ! объявление структуры

   RECORD /full_name/ personsname   ! вложение структурыfull_name подименем personsname.

  INTEGER*1 age

  INTEGER*4 phone

END STRUCTURE

Структура full_name можетиметь следующий вид:

STRUCTURE/full_name/

  Character*15 first_name

  Character*20 last_name

END STRUCTURE

Обращение кэлементам структуры может быть осуществлено следующим образом:

WRITE(5,*) ‘имя:’, full_adress.personsname.first_name

WRITE(5,*) ‘возраст:’ full_adress.age

б) Объявлениецелой функции setvideomode.

Атрибут EXTERNуказывает, что переменная (в данном случае являющаяся именем функции)размещается в другом исходном файле. Вообще атрибут позволяет определить дляпеременной, типа переменной, п/п или формальных параметров п/п некоторуюдополнительную информацию. Атрибут заключается в квадратные скобки [ ].

Ранеерассматривался пример с атрибутом ALLOCATABLE, указывающим, что массив является динамическим(“размещаемым”).

в) Объявлениепользовательского имени как внешней п/п getvideoconfig.

г) Объявлениесимволических констант. В данном случае, задаются значения цветов (вшестнадцатиричном виде) двум целым константам.

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

Файл FGRAPH.FI включается вначало каждого исходного файла программы, а FGRAPH.FD в каждуюп/п, содержащую графическую процедуру. Включение производится оператором include –вставка содержимого указанного файла в позиции оператора include.

Пример:

include ‘fgraph.fi’            ! вставка текста файла fgraph.fi

………………….

programLINE

………………….

include‘fgraph.fd’

/>………………….                                            символическаяконстанта

I2 = setvideomode ($MAXRESMODE) ! графическая функция установки видеорежима

………………….

end

2. Установкавидеорежима

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

тип используемогомонитора и видеокарты;

разрешение экрана;

использованиецветного или монохромного изображения;

количествоотображаемых цветов, определяемое количеством памяти выделяемой под цвет. Так“четырех битный цвет” соответствует шестнадцати цветам, восьми битный – 256(т.е. два в восьмой степени) и т.д.

В настоящее времяобычно используется 16 и 24 битные цвета.

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

Получение такойинформации:

Record /videoconfig/  Myvideoconf   ! включение структуры videoconfig под именем Myvideoconf

……………………..

call getvideoconfig (Myvideoconf)     ! вызов п/п определения видеоконфигурации

Элементы структурыvideoconfig описаны в файле fgraph.fd. Данной п/п можно узнать разрешение экрана, возможноеколичество цветов и т.д. Значения возвращаются через элементы структуры.

Установитьграфический видеорежим можно функцией setvideomode.

Пример:

dum =setvideomode ($MAXRESMODE)

В функциюпередается идентификатор (номер) видеорежима. В данном случае передаетсясимволическая константа целого типа $MAXRESMODE (= — 3), определенная в файле FGRAPH.FD иопределяющая, что выбирается и устанавливается видеорежим с максимальнымразрешением.

В случаевозникновения ошибки функция возвращает значение 0.

3. Установка средыизображения.

Переднепосредственным выводом изображения необходимо произвести некоторыепредварительные настройки.

Установка курсора.

Функция displaycursorпозволяет включить или выключить изображение курсора.

Пример:

I2 = displaycursor (1)    ! включение курсора, 0 – выключение. Можноиспользовать символические константы $GCURSOROFF и $GCURSORON.

3.2 Установкапалитры.

Каждому цвету наэкране ставится в соответствие индекс цвета, по которому он вызывается. Обычноимеется 16 индексов, которым соответствуют 16 стандартных цветов, хотя самихцветов может быть больше.

Для ассоциированияцвета конкретному индексу используются процедуры: remappallpalette, remappalette и selctpalette.

Значение цветаопределяется целым числом, состоящим из четырех байт (32 битов). Цвет задаетсяуказанием уровня интенсивности для каждого значения красного, зеленого иголубого цветов (RGB модель).

Значение цвета вдвоичном виде:

        zzzzzzzz  zzBBBBBB  zzGGGGGG  zzRRRRRR, где z это 0, а B, G и R – значениябитов для соответствующих цветов различной интенсивности. 1 (двоичные 00000001)соответствует минимальной интенсивности, а 63 (двоичное 00111111) максимальной.Чисто желтому цвету (100% зеленого и 100% красного) соответствуют значение:

(00000000 0000000000111111 00111111)2 = (1392447)10 = (153f3f)16

белому (всего по100%): (4144959)10 = (3f3f3f)16

Пример:

               i2 = remapalette(1#153f3f)           ! присвоение индексу 1 желтого цвета

аналогично

              i2 = remapalette (1,1392447)

аналогично

               i2 = remapalette(1,$YELOW)       ! где $YELOW – константа, соответствующая желтому цвету (определена вфайле Fgraph.fd)

Функция remappallpaletteвыполняет одновременное переназначение всех индексов цвета. В функциюпередается массив значений цветов.

Установкакоординатных систем

Текстовыекоординаты.

Текстовыекоординаты служат для отображения текста шрифтом фиксированного размера.Координаты текста задаются в строках и столбцах. В обычном текстовом режиме: 25строк и 80 столбцов. Установка текстовых координат осуществляется графическойп/п settextposition.

Пример:

                  call settextposition (10, 50, rc)

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. Переустановка начала координат повлияет на всеграфические процедуры.

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

Пример:

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

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

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

Пример:

CallSetViewPort(20,20,200,200)

Аналогично:

CallSetClipRgn(20,20,200,200)

CallSetViewOrg(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 tofunction getch()

  integer getch[C,alias:’_getch’]

end

program   graph_examples

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

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

integergetch[EXTERN]

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

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

callgraph_win()

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

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

end

subroutinegraph_win()

include   'fgraph.fd'

integer*2dum

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

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

record/xycoord/xy

record/videoconfig/vc

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

callsetvieworg(50,100,xy)

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

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

dum=setcolor(2)

callmoveto(-50,-100,xy)

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

read*

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

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

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

read*

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

callclearscreen($gclearscreen)

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

read(5,*)dg,dv

callsetviewport(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.

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

CallSetLineStyle (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.

   Пример:

CallMoveTo (50,60,xy)

CallOutGText (‘Minsk, 2001’)

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

Character*12 val

……………………

callmoveto (xdin + 5, posy, xy)

calloutgtext (‘E=’)

write(val,’(f12.2\)’)E

calloutgtext (val)        ! вывод значения

calloutgtext (' MPa')

Определениепараметров установленного шрифта можно осуществить функцией GetFontInfo,которая возвращает характеристики шрифта в виде структуры fontinfo,определенной в файле fgraph.fd.

Пример:

  RECORD /fontinfo/fi

  ………………………

   dum= GetFontInfo (fi)

  write (5,*)’     Путь к файлу шрифта –‘,fi.filename

Элементы структурыfontinfo:

/>type – тип шрифта:1-векторный, 0-битовый

ascent – размещение от верхней базовой линии пиксела

      Integer*2    pixwidth–ширина символов в пикселях (0-пропорциональный шрифт)

              pixheight — высота символов в пикселях (0-пропорциональный шрифт)

              avgvidth –средняя ширина символов в пикселях

             

/>              filename – имя файла с путем доступа

Character          facename– имя шрифта.

Выгрузка шрифта.

Выгрузказарегистрированных шрифтов из памяти осуществляется п/п UnRegisterFonts()

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

!             File: geomshar.for

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

$STORAGE:2 !Переменные и константы целого типа:2-х байтовые (integer*2)

$DECLARE     !Генерация предупреждающих сообщений для необъявленных переменных

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

      interface to function getch()     ! Объявление ф-ции getch, ее

      integergetch [C, alias:'_getch']! атрибутов, типов формальных

      end                                           !параметров

     program    Demonstr_devide_screen! Объявлениеголовной программы

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

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

      integer  getch [EXTERN]

     include 'fgraph.fd'! Объявление типовграфических функций, объявление и задание параметров, определение структур(STRUCTURE) в каждой графической п/п

      i2=setvideomode($MAXRESMODE) ! Установить видеорежим с max разрешением

      call devide_graph_area()

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

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

      end

 ! п/п деленияэкрана на 4 области

      subroutine devide_graph_area()

     include    'fgraph.fd'

     integer*2 i2

      integer*2nx,ny      ! Max кол-во пиксел по X и Y

      integer*2 xdin,ydin! Координаты общей точки областей

!    integer*2 nr,nc      ! Max кол-во строк истолбцов

      real kx,ky

     record /videoconfig/ vc   ! Подключ.структуры videoconfig

!     record/rcCOORD/ rc     ! и rccoord, определенных в файле fgraph.fd

      record/xyCOORD/ xy    ! xy — образец типа xycoord

      call clearscreen($GCLEARSCREEN)! Очистка экрана

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

      kx=75.0  !Коэф-ты в %, определяющие положе-

      ky=80.0  !ние общей точки областей

     nx=vc.numxpixels! см. файл fgraph.fd

     ny=vc.numypixels! см. файл fgraph.fd

      xdin=int2(kx*nx/100)

     ydin=int2(ky*ny/100)

     i2 = setbkcolor($GRAY)       ! Установкацвета фона

      i2=setcolor(6)                      ! Цвет красный

      i2=rectangle($GBORDER,1,1,nx-1,ny-1)! Рамкавсей области экрана

       i2=rectangle($GBORDER,2,2,xdin,ydin)! Рамка области чертежа

      i2=rectangle($GBORDER,2,ydin+1,xdin,ny-2)! Рамка области ввода

      i2=rectangle($GBORDER,xdin+1,2,nx-2,ydin)! Рамка информац. области

      i2=rectangle($GBORDER,xdin+1,ydin+1,nx-2,ny-2)! Областьавтора

      i2=setcolor(12)                      ! Цвет светлокрасный

 !    Оформлениеобласти автора

      if (registerfonts('D:\MSLIB\*.fon').LT.0) then!инициализация

       i2=registerfonts('C:\MSLIB\*.fon')              ! шрифтов

     end if                                                            ! библиотеки

     i2=setfont(»t'Helv Cyrillic'h18w8b«C)! Установка шрифта

!       i2=settextcolor(2)    ! Установка цвета текста

!       nr=vc.numtextrows

!       nc=vc.numtextcols

     call moveto(xdin+40,ydin+10, xy)

     call outgtext (' ¦ ¦ + +')! Вывод текста втекущ. позицию

      call moveto(xdin+30,ydin+30, xy)

     call outgtext ('+ГЕбМГ +.+.')

     call moveto(xdin+50,ydin+50, xy)

     call outgtext ('   1998')

      end

Примериспользования функции Getch, возвращающей код нажатой клавиши.

!  Программа печати кода нажатой клавиши

$debug

     interface to function getch()

        integer*2 getch [C, alias:'_getch'] ! ИнтерфейсСи функции

      end

      integer *2 getch [EXTERN]

     integer *2 scod

     integer i

      do i=1,26 ! Отступ в 26 строк

         print*

     enddo

  1 FORMAT(32x,'КОДКЛАВИШИ — ',I3)

      print*,'                             НАЖМИТЕ ЛЮБУЮ КЛАВИШУ'

10 print*

     SCOD=getch() ! Отслеживание кода нажатойклавиши

      print1,scod ! Печать кода

      print*

     print*,'                   ( Для выхода в VC  -  нажмите ^BREAK )' !Прерывание выполнения программы

     print*,'                   ( Для продолжения  -  любую клавишу ) '

      go to 10 !Бесконечный цикл

      end

Дополнительныевозможности вывода текста.

Текст стандартнымшрифтом в любую позицию экрана можно вывести процедурой OutText.Процедура outtext не производит форматирование текста и работает во всехвидео режимах. Текст выводится стандартным шрифтом.

   Пример:

 RECORD/record/ rc

 ……………………..

 dum = SetTextColor(9)         ! восстановление цвета текста

 call SetTextPosition (20,20,rc)

 text = ‘программа демонстрации’

 callouttext (text)

Вывод текста(сверху вниз) можно осуществить только в пределах заданной области экрана(текстового окна), которое устанавливается процедурой SetTextWindow. Призаполнении окна происходит прокрутка.

Синтаксис call SetTextWindow (r1,c1,r2,c2)

   Где: r1,c1- текстовые координаты (строка и столбец) левого верхнегоугла прямоугольного окна, r2,c2 – то же правого.

Пример работы стекстовым окном:

!             File: textwin.for

! Программа установки текстового окна и ввода элементовмассива

! Программаустойчива при некорректном вводе. Выход из программы осуществляется нажатиемEsc

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

$STORAGE:2   !Переменные и константы целого типа:2-х байтовые (integer*2)

$DECLARE     !Генерация предупреждающих сообщений для необъявленных переменных

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

      interface to function getch()     ! Объявление ф-ции getch, ее

      integergetch [C, alias:'_getch']! атрибутов, типов формальных параметров

      end

     program    Demonstr_Text_Window! Объявлениеголовной программы

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

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

      include 'fgraph.fd'! Объявление типов графических функций, объявление и заданиепараметров, определение структур (STRUCTURE) в каждой графической п/п

      i2=SetVideoMode($MAXRESMODE) ! Установить видеорежим с max разрешением

      call SetTextWin()            ! Вызов п/п

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

      end

      subroutine SetTextWin()

     include    'fgraph.fd'

     integer  getch [EXTERN] ! Функция возвратакода нажатой клавиши

      integer*2 i2

     integer*2 i, j, k, m

     integer*2 nr, nc         ! Max кол-во строк истолбцов

      integer*2 nx, ny        ! Max кол-во пиксел по X и Y

      realA(3,3)                ! Вспомогательный массив

      real kr,kc

     character*12 ValElem

     character*6 vl

     character*1 one

     record /videoconfig/ vc ! Подключ. структуры videoconfig

     record /rcCOORD/ rc   ! и rccoord, определенных в файле fgraph.fd

     call ClearScreen($GCLEARSCREEN)! Очистка экрана

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

     nx=vc.NumXPixels        ! см. файл fgraph.fd

     ny=vc.NumYPixels        ! см. файл fgraph.fd

     nr=vc.NumTextRows     ! см. файл fgraph.fd

     nc=vc.NumTextCols      ! см. файл fgraph.fd

     i2=SetBkColor($GRAY) ! Установка цвета фона

     i2=SetColor(2)               ! Цвет рисования зеленый

      i2=SetTextColor(6)        ! Цвет текста красный

      kr=0.8

      kc=0.75

     call SetTextWindow(Int(kr*nr)+2,2,nr-1,Int(kc*nc))! Текстовое окно

     i2=rectangle($GBORDER,1,Int(kr*ny),Int(kc*nx),ny-1)! Рамка области ввода

      do i=1,3

        do j=1,3

         call SetTextPosition(1,2,rc)  !  Установканачальной позиции

         write(vl,11) i, j! Помещение индексов массива в буфер (внутренний файл) (поформату 11)

          callOutText(' Ведите элемент массива А'//vl)

          ValElem=' '                ! Символьное обнуление

         m=0                       ! Числовое обнуление

          dok=1,24                 ! Количество вводимых цифр

           i2=getch()              ! Возврат кода нажатой клавиши

            if (i2.eq.13) exit      ! Нажат ввод

           if (i2.eq.27) return    ! Нажата Esc (выходиз программы)

            call GetTextPosition(rc)! Возврат текущей позиции

            callSetTextPosition(rc.row,rc.col,rc) ! и ее установка

            write(one,'(a)') char(i2)  !  Печать в буфер введенного символа

            if (i2.eq.8) then  !  Нажата клавиша Backspace

             call SetTextPosition(rc.row,rc.col-1,rc)

             write(one,'(a)') ' '! При нажатии BackSpaceудаляется

            endif                ! последний введенный символ (запись в буфер пробела)

            call OutText(one)     ! Печать введенного символа

           if (i2.eq.8) call SetTextPosition(rc.row,rc.col-1,rc)! При печати пробела смещаемся влево, поэтому возврат

            if (i2.ge.48.and.i2.le.57.or.i2.eq.43.or.i2.eq.45.or.i2.eq.46.or.i2.eq.69.or.i2.eq.101)then

! Перечислены кодыследующих символов:0,1,2,3,4,5,6,7,8,9,+,-,.,E,e

             m=m+1! Отсчет количества введенных символов

              if (m.eq.12) exit! Максимум 12 символов

             write(ValElem,'(a,a)') ValElem(1:m),char(i2) ! Вбуфер помещается первые m символов и введенный

            else

             if (i2.ne.8) call SetTextPosition(2,2,rc)

             if (i2.ne.8) call OutText(' Ошибка ввода! ')

             if (i2.eq.8) write(ValElem,'(a,a)') ValElem(1:m),' '! При нажатии Backspace

             if (i2.eq.8) m=m-1! Удаление последнегосимвола

            end if

          end do

         call SetTextPosition(3,2,rc)

          read(ValElem,'(f12.0)')A(i,j)! Преобразование символа в число (через буфер)

          write(5,*)'Элемент массива ',A(i,j)

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

          call ClearScreen($GWINDOW)! Очистка текстового окна

         i2=SetColor(8)            ! Цвет зеленый

         i2=rectangle($GFILLINTERIOR,0,0,nx,ny)

         i2=SetColor(2)            ! Цвет зеленый

         i2=rectangle($GBORDER,1,Int(kr*ny),Int(kc*nx),ny-1)

       end do

     end do

11   format('(',i1,',',i1,') ')

      end

     Для переносатекста в пределах окна используется функция WrapOn.

Пример:

   dum = WrapOn($gwrapon), где:

              $gwrapon –символическая константа, указывающая на перенос строки по границе окна

              $gwrapoff –обрывание строки по границе окна.

Функция неоказывает влияние на вывод текста шрифтом (с помощью outgtext).

Вставка рисунка изфайла

Вставка рисункаформата pcx в любую позицию экрана возможно с использованием файловбиблиотек gx_cl.lib и pcx_cl.lib, gxint.for, pcxint.for. Вставляемый рисунок должен иметь формат pcx.

! File:ins_pic.for

! Программадемонстрации вывода рисунка из файла на экран

! ??Закомментировать строки 156,157 файла gxlib.for

! Компиляцияпроизводится с подключением библиотек gx_cl.lib, pcx_cl.lib

! (flins_pic.for gx_cl.lib pcx_cl.lib)

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

$STORAGE:2   !Переменные и константы целого типа:2-х байтовые

$INCLUDE:'gxint.for'! Подключение библиотечных файлов

$INCLUDE:'pcxint.for'

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

      program   InsertPcxImage! Объявление головной программы

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

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

      include 'gxlib.for'

     include 'pcxlib.for'

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

      integer*2  pcxType

     character*20 pcxImage

     parameter (pcxType=gxVGA_12)! см. стр.178 файл gxlib.for

!     parameter (pcxType=gxVGA_11)! см. стр.178 файл gxlib.for

     parameter (pcxImage='bpaexp.pcx'C)! Имя файла рисунка

     record /videoconfig/ vc

     i2 = gxSetDisplay(pcxType)! Определениеиспользуемого типа монитора и режима

      i2 = gxSetMode(gxGRAPHICS)

     i2=setvideomode($MAXRESMODE) ! Установитьвидеорежим с max разрешением

      call getvideoconfig(vc)

     i2 = pcxFileDisplay(pcxImage,100,100,0)! Вставкарисунка

      read*

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

      end

Формат файла PCX

Первые 128 байткаждого файла PCX или PCC содержат заголовок файла изображения. Заголовокопределяет ширину и глубину изображения, количество плоскостей, число бит наточку, а также другую информацию, необходимую для многократного создания изображения.

 Заголовокнесколько изменен в новой версии пакета. В него добавлены три новых поля:PALINFO, SHRES и SVRES. Поле palinfo определяет, является ли изображениецветным (palinfo=1) или в оттенках серого (palinfo=2). Когда программа PCPaintbrush загружает изображение, и она видит, что это серое изображение,программа устанавливает палитру как свою собственную внутреннюю серую палитру.Пакет не обрабатывает палитры подобным способом (текущая палитра ВСЕГДАхранится ВМЕСТЕ с изображением), поэтому он игнорирует это поле. Однако, вцелях совместимости, пакет устанавливает флаг palinfo для обозначения цвета.

 Два других поля,shres и svres, предназначены для хранения разрешения развертки (сканнера). Онибыли созданы для того, чтобы не путать замену разрешения экрана на разрешениеразвертки (сканнера) в полях hres и vres. Прежние пользователи заметят, что этобыло бы показано как 'Разрешение дисплея: 75 х 75' при использовании утилитыpcxHdr. Теперь поля hres и vres будут содержать экранное разрешение создающегоустройства, во всех будущих версиях Paintbrush (1.62 и выше).

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

Некоторыеотносящиеся к графике термины

Bitmap‑Способкодирования изображения пиксел за пикселом.

Buffer‑буфер.Область временного хранения данных, часто используется для компенсации разницыв скорости работы различных компонентов системы. Часто, в качестве буфераиспользуется дополнительная память, зарезервированная для временного храненияданных, которые передаются между центральным процессором системы и периферией(такой, как винчестер, принтер или видеоадаптером). Особенно полезен буфер длякомпенсации разницы в уровнях интенсивности потоков данных, для обеспеченияместа размещения данных, когда процессы асинхронны (например, данные переданныев контроллер видеоплаты должны дождаться, когда графический процессор закончитвыполнение текущей операции, и считает новую порцию информации), и для сохраненияданных в неизменном виде (как буфер для видеокадра). Некоторые буферы являютсячастью адресуемой памяти центрального процессора системы, другие буферы памятиявляются частью периферийных устройств.

Gamma Correction‑передвыводом на дисплей линейные данные RGB должны быть обработаны (скорректированы)для компенсации гаммы (нелинейной составляющей) дисплея.

Pixel‑пиксель.Комбинированный термин, обозначающий элемент изображения, являющийся наименьшимэлементом экрана монитора. Другое название — pel. Изображение на экране состоятиз сотен тысяч пикселей, объединенных для формирования изображения. Пиксельявляется минимальным сегментом растровой строки, которая дискретно управляетсясистемой, образующей изображение. С другой стороны, это координата, используемаядля определения горизонтальной пространственной позиции пикселя в пределахизображения. Пиксели на мониторе — это светящиеся точки яркого фосфора,являющиеся минимальным элементом цифрового изображения. Размер пикселя не можетбыть меньше точки, которую монитор может образовать. На цветном мониторе точкисостоят из групп триад. Триады формируются тремя различными фосфорами: красным,зеленым и синим. Фосфоры располагаются вдоль сторон друг друга. Пиксели могутотличаться размерами и формой, в зависимости от монитора и графического режима.Количество точек на экране определяются физическим соотношением ширины к высотетрубки.

RGB‑системацветообразования, в которой конечный цвет получается за счет смешения, сразличной интенсивностью, трех основных цветов: красного (Red), зеленого(Green) и синего (Blue). Самое известное устройство, которое использует системуRGB, это цветной монитор.

Resolution‑разрешение.Количество пикселей представленное битами в видеопамяти, или адресуемоеразрешение. Видеопамять может организовываться соотношением пикселов (битов) пооси x (пикселы на строке) к числу пикселов по оси y (столбцы) и к размеруотводимой памяти на представление глубины цвета. Стандартная видеопамять VGA640 пикселов на 480 пикселов и, обычно, с глубиной представления цвета 8 бит.Чем выше разрешение, тем более детально изображение, тем больше нужно хранить онем информации. Но не вся хранимая информация может быть отображена на дисплее.

Texture‑двумерноеизображение хранящееся в памяти компьютера или графического акселератора водном из пиксельных форматов. Вслучае хранения в сжатом виде на дисках компьютера, текстура может представлятсобой обычный бит-мап который мы привыкли видеть в форматах bmp, jpg, gif ит.д. Перед использованием, текстура разворачивается в памяти и может заниматьобъем в десятки раз больше первоначального размера. Существует порядка двухдесятков более или менее стандартизированных пиксельных форматов текстур.

Список литературы

Для подготовкиданной работы были использованы материалы с сайта www.shpora-zon.narod.ru/

еще рефераты
Еще работы по информатике, программированию