Графічне програмування на b> Ms b> b> Fortran b> p>
Курс лекцій з
дисципліни за спеціальністю «ПГС» після
технікуму p>
Факультет --
будівельний; кафедри - «Металеві та дерев'яні конструкції» і
«Залізобетонні та кам'яні конструкції» p>
Завдання курсу h2>
Засвоєння основних принципів
розробки інженерних алгоритмів і графічних програм, що реалізовуються в
Надалі на різних мовах програмування. Мова Fortran розглядається не як самоціль, а як інструмент навчання
програмування. p>
Література p>
1) Уорд Т., Бромхед Е. Фортран і
мистецтво програмування персональних ЕОМ. - М.: Радіо і зв'язок, 1993.-352с. P>
2) Програмування на Фортране
77/Дж. Ашкрофт, Р. Елдрідж и др. - М.: Радіо і зв'язок, 1990.-272с. P>
3) БАРТЕНЄВ О.В. Фортран для
студентів. - М.: "Диалог-МИФИ", 1999.-400с. P>
4) Рижиков Ю.І. Програмування
на Фортране Pоwer Statiоn для інженерів. Практич. рук-во. - СПб.: КОРОНАпрінт,
1999.-160с. P>
5) Н.А Рак, В.И Сміх, С.Б.
Щербак Програмування інженерних задач на FORTRANе: Уч. методич. допомогу з
дисц. "Вич. Техн. І программир." - Мн.: БГПА, 1998.-45с. P>
6) Соловйов П.В. FORTRAN для
персонального комп'ютера: Справ. посібник. - М.: Аріст, 1991.-224с. P>
7) Н.А Рак, В.И Сміх, С.Б.
Щербак Графічне програмування: Уч. методич. пособие по дисц. "Вич.
техн. і программир. "- Мн.: БГПА, 1997.-40с. p>
8) БАРТЕНЄВ О.В. Графіка
OрenGL: програмування на Фортране. М.: ДИАЛОГ-МИФИ, 2000.-368с. P>
Етапи розробки графічних програм h2>
Для розробки графічних програм на Fortran необхідно мати на
наявність бібліотеки графічних процедур, що містяться у файлі Graphics.lib. p>
Розробка графічних програм складається з наступних етапів: p>
Підключення графічної бібліотеки p>
Установка відеорежиму p>
Установка середовища зображення p>
Створення і управління графікою p>
Відновлення первісної конфігурації перед виходом з
програми p>
Графічні процедури полягають функції і підпрограми.
Кожна програма, що використовує графічну бібліотеку повинна ЯВНО оголосити
процедури. Окрему використовувану графічну процедуру можна оголосити, написавши
її інтерфейс (дивись довідку NORTON GUIDE).
Одразу всі графічні процедури можна описати, включивши в програму файли FGRAPH.FI і FGRAPH.FD.
FGRAPH.FI - містить оголошення
процедур в операторах INTERFACE (див. далі). p>
Оператор INTERFACE оголошує ім'я
процедури (функції), її атрибути і типи формальних параметрів. Оператор
використовується для забезпечення коректності викликів п/п. Компілятор виконує
перевірку числа і типів параметрів у виклику п/п з параметрами, зазначеними в
інтерфейсі. p>
Приклад: p>
INTERFACE TO INTEGER FUNCTION Func (p, d, q) p>
Integer * 2 p p>
Real d типи параметрів p>
Real * 8q p>
END p>
де: INTEGER - тип функції; FUNCTION - функція; Func
- Ім'я функції; p, d, q --
формальні параметри. p>
Тут оголошена ціла функція (яка повертає ціле значення) Func
з трьома вхідними параметрами p, d, q.
Виклик цієї функції звичайний: p>
K = Func (p, d, q) p>
INTERFACE TO
________________ SUBROUTINE Mix
(a, b, c) - оголошує п/п
(знаходиться в бібліотечному файлі з розширенням. LIB), що знаходиться в іншому
файлі. p>
Виклик п/п звичайний CALL MIX (a, b, c) p>
Файл FGRAPH.FD містить оголошення
структурних і символічних констант і оголошень операторів EXTERNAL для графічних процедур. p>
Приклад, коду файл FGRAPH.FD: p>
ім'я
структури p>
STRUCTURE/videoconfig/ p>
Integer * 2 numxpixels
елементи структури p>
а) Integer * 2 numypixels p>
... ... ... ... ... ... ... ... .... оператори оголошення
типів і/або RECORD. p>
END STRUCTURE p>
б)
INTEGER * 2 setvideomode [extern] PARAMETER ($ YELLOW = # 153f3f) p>
в) EXTERNAL getvideoconfig
PARAMETER ($ BRIGHTWHITE = # 3f3f3f) p>
г)
INTEGER * 4 $ YELLOW, $ BRIGHTWHITE p>
а) Визначення складеного типу змінної (структури). p>
Звернутися до елементу структури
(для присвоєння або отримання значення) можна в такий спосіб: p>
X =
videoconfig.numxpixels p>
p>
ім'я
структури елемент структури p>
Структури можуть вкладатися одне в одного з використанням
оператора RECORD - оголошує структуру для імен, що визначаються
користувачем. p>
Приклад: p>
STRUCTURE/full_adress /
! оголошення структури p>
RECORD
/ full_name/personsname! вкладення
структури full_name під ім'ям personsname. p>
INTEGER * 1 age p>
INTEGER * 4 phone p>
END STRUCTURE p>
Структура full_name
може мати такий вигляд: p>
STRUCTURE/full_name/ p>
Character * 15 first_name p>
Character * 20 last_name p>
END STRUCTURE p>
Звернення до елементів структури може бути здійснено наступним
так: p>
WRITE (5, *) 'ім'я:', full_adress.personsname.first_name p>
WRITE (5, *) 'вік:' full_adress.age p>
б) Оголошення цілої функції setvideomode. p>
Атрибут EXTERN вказує, що
мінлива (в даному випадку є ім'ям функції) розміщується в іншому
вихідному файлі. Взагалі атрибут дозволяє визначити для змінної, типу
змінної, п/п або формальних параметрів п/п деяку додаткову
інформацію. Атрибут полягає у квадратні дужки []. P>
Раніше розглядався приклад з атрибутом ALLOCATABLE, що вказує, що
масив є динамічним ( "розміщених "). p>
в) Оголошення призначеного для користувача імені як зовнішньої п/п getvideoconfig. p>
г) Оголошення символічних констант. У даному випадку, задаються
значення кольорів (в шестнадцатірічное вигляді) двом цілим констант. p>
Вказані файли містять оголошення, необхідні для використання
графічних процедур. p>
Файл FGRAPH.FI включається в початок
кожного файлу з вихідними текстами програми, а FGRAPH.FD
в кожну п/п, яка містить графічну процедуру. Включення проводиться оператором
include - вставка вмісту вказаного файлу в позиції
оператора include. p>
Приклад: p>
include 'fgraph.fi'! вставка тексту файла fgraph.fi p>
... ... ... ... ... ... .... p>
program LINE p>
... ... ... ... ... ... .... p>
include 'fgraph.fd' p>
... ... ... ... ... ... .... символічна
константа p>
I2 = setvideomode ($ MAXRESMODE)! графічна функція
установки відеорежиму p>
... ... ... ... ... ... .... p>
end p>
2. Установка відеорежиму p>
Установка відеорежиму необхідна для виконання графічних
процедур. Під видеорежимов мається на увазі: p>
тип монітора і відеокарти; p>
дозвіл екрану; p>
використання кольорового або монохромного зображення; p>
кількість відображуваних кольорів, яке визначається кількістю пам'яті
виділяється під колір. Так "чотирьох бітний колір" відповідає шістнадцяти
квітам, восьми бітовий - 256 (тобто два у восьмому ступені) і т.д. p>
В даний час зазвичай використовується 16 і 24 бітні кольори. p>
Іноді до установки відеорежиму для запобігання можливим
проблем несумісності необхідно отримати інформацію про поточну відеосистеми. p>
Отримання такої інформації: p>
Record/videoconfig/Myvideoconf! включення структури videoconfig під ім'ям Myvideoconf p>
... ... ... ... ... ... ... ... .. p>
call getvideoconfig (Myvideoconf)! виклик
п/п визначення відеоконфігураціі p>
Елементи структури videoconfig описані у файлі fgraph.fd. Даною п/п можна дізнатися дозвіл екрану, можливе
кількість квітів і т.д. Значення повертаються через елементи структури. P>
Встановити графічний режим відео можна функцією setvideomode. p>
Приклад: p>
dum = setvideomode ($ MAXRESMODE) p>
В функцію передається ідентифікатор (номер) відеорежиму. У даному
випадку передається символічна константа цілого типу $ MAXRESMODE (= - 3), визначена
у файлі FGRAPH.FD і визначає, що
вибирається і встановлюється режим відео з максимальною роздільною здатністю. p>
У разі виникнення помилки функція повертає значення 0. p>
3. Установка середовища зображення. P>
Перед безпосереднім висновком
зображення необхідно зробити деякі попередні налаштування. p>
Встановлення курсору. p>
Функція displaycursor дозволяє включити або
вимкнути зображення курсору. p>
Приклад: p>
I2 = displaycursor (1)! включення курсору, 0 - вимикання.
Можна використовувати символічні константи $ GCURSOROFF і $ GCURSORON. P>
3.2 Встановлення палітри. p>
Кожному кольору на екрані ставиться
у відповідність індекс кольору, за яким він викликається. Звичайно є 16
індексів, яким відповідають 16 стандартних квітів, хоча самих квітів може
бути більше. p>
Для асоціювання кольору конкретному індексу використовуються
процедури: remappallpalette, remappalette і selctpalette. p>
Значення кольору визначається цілим числом, що складається з чотирьох
байт (32 бітів). Колір задається вказівкою рівня інтенсивності для кожного
значення червоного, зеленого та блакитного кольорів (RGB модель). p>
Значення кольору в двійковому вигляді: p>
zzzzzzzz zzBBBBBB zzGGGGGG zzRRRRRR, де z
це 0, а B, G і R --
значення бітів для відповідних кольорів різної інтенсивності. 1 (двійкові
00000001) відповідає мінімальній інтенсивності, а 63 (двійкове 00111111)
максимальною. Чисто жовтого кольору (100% зеленого і червоного 100%) відповідають
значення: p>
(00000000 00000000 00111111 00111111) 2 = (1392447) 10
= (153f3f) 16 p>
білому (усього за 100%): (4144959) 10 = (3f3f3f) 16 p>
Приклад: p>
i2
= Remapalette (1 # 153f3f)! Присвоєння індексу 1 жовтого
кольору p>
аналогічно p>
i2 = remapalette (1,1392447) p>
аналогічно p>
i2
= Remapalette (1, $ YELOW)! Де $ YELOW - константа,
відповідна жовтому кольору (визначена у файлі Fgraph.fd) p>
Функція remappallpalette виконує
одночасне перепризначення всіх індексів кольору. В функцію передається масив
значень кольорів. p>
Установка координатних систем p>
Текстові координати. p>
Текстові координати служать для відображення тексту шрифтом
фіксованого розміру. Координати тексту задаються в рядках і стовпцях. У звичайному
текстовому режимі: 25 рядків і 80 стовпців. Установка текстових координат
здійснюється графічної п/п settextposition. p>
Приклад: p>
call settextposition (10, 50, rc) p>
10, 50-координати початку тексту; rc - локальне ім'я
структури rccoord (див. fgraph.fd)
за допомогою якої повертається і передається в п/п попередня текстова
координата для її перерозміщенні в нову. Координата (1,1) знаходиться в лівому
верхньому кутку. p>
Фізичні координати. p>
Фізичні координати є
фіксованими і визначаються технічними засобами (відкритий і
монітором). Початок координат знаходиться в лівому верхньому кутку, якщо не
використовується п/п setvieworg. Дозволи 640 * 480;
800 * 600. Фізичні координати є цілочисельними. P>
Приклад: перенесення початку координат
в точку (50, 100) p>
CALL setvieworg (50, 100, xy) p>
Тепер координата x змінюється від 50, до. numxpixels-50, а y, від 100 до. numypixels-100, де numxpixels і numypixels - елементи структури videoconfig, що містять Максимальна кількість пікселів по осях OX та OY. Перевстановлення початку координат
вплине на всі графічні процедури. p>
Використовуючи фізичні координати
можна встановити невидиму координатну область - "область кліпу".
Малювання в цьому випадку проводиться тільки в цій області, спроба малювання
поза областю ігнорується. p>
Приклад: p>
call setcliprgn (10,10,100,100) - установка квадратної "області кліпу".
Процедура setcliprgn не змінює систему координат. P>
3.3.3 Координати порту перегляду p>
"Порт перегляду" ( "viewport") - прямокутна ділянка екрану в якій здійснюється
малювання. "Порт перегляду" встановлюється процедурою setviewport. Дія цієї процедури аналогічно процедурі setcliprgn, але з перенесенням початку координат в лівий верхній кут
області. При використанні "віконних" координат необхідно створити "порт
перегляду ". p>
Приклад: p>
Call SetViewPort (20,20,200,200) p>
Аналогічно: p>
Call SetClipRgn (20,20,200,200) p>
Call SetViewOrg (20,20) p>
Віконні координати. p>
Віконні координати використовуються
для масштабування зображення. Вони встановлюються для поточного порту
перегляду. Всі функції роботи з вікнами закінчуються символом "-w". Значення віконних координат мають не цілочисельний тип Integer (як звичайно), а матеріальний тип Real * 8. P>
Приклад: p>
dum = SetWindow (. TRUE., -200., -56,3., 500., 400.) --
установка віконних координат цього "порту перегляду" p>
. TRUE. - Збільшення по
осі ординат знизу вгору p>
. FALSE. - Збільшення по осі ординат зверху вниз p>
p>
На малюнку в круглих
дужках () показані фізичні координати, в квадратних [] віконні
координати. На кожний фізичний піксель по ДГ доводиться віконних pixel та
по OY 1.91. p>
При нульових розмірах
вікна функція не виконується. При успішному виконанні функція setwindow повертає нульове значення. P>
Приклад роботи з координатними
системами. Наведено стандартна головний програма і п/п. p>
$ DEBUG!
Виробляє додаткові перевірки при компіляції p>
include 'fgraph.fi'! Включення графічних інтерфейсів p>
interface to function getch () p>
integer
getch [C, alias: '_getch'] p>
end p>
program
graph_examples p>
implicit NONE! Заборонити неявне оголошення типів p>
integer * 2 dum!
Фіктивна мінлива p>
integer getch [EXTERN] p>
include
'fgraph.fd'! Оголошення типів
графічних функцій p>
dum = setvideomode ($ MAXRESMODE)! Встановити режим відео з максимальною роздільною здатністю p>
call graph_win () p>
dum = getch ()! Затримка до натискання будь-якої клавіші p>
dum = setvideomode ($ DEFAULTMODE)! Встановити попередній
відеорежим p>
end p>
subroutine graph_win () p>
include
'fgraph.fd' p>
integer * 2 dum p>
!
DOUBLE PRECISION dg, dv, maxdim, xcen, ycen p>
real * 4 dg, dv, maxdim, xcen, ycen p>
record/xycoord/xy p>
record/videoconfig/vc p>
! Переміщення початку координат в точку (50,100) p>
call setvieworg (50,100, xy) p>
! Малювання діагональної лінії p>
call getvideoconfig (vc)!
визначення відеоконфігураціі p>
dum = setcolor (2) p>
call moveto (-50, -100, xy) p>
dum = lineto (vc.numxpixels-50, vc.numypixels-100) p>
read * p>
call setviewport (100,100,200,200)! вікно
перегляду, координати - фізичні p>
dum = floodfill (1,1,3)! заповнення області (вікна перегляду) поточним
кольором p>
! за відсутності вікна перегляду заповнюється весь екран p>
read * p>
! Малювання та масштабування еліпса в квадратному вікні перегляду p>
call clearscreen ($ gclearscreen) p>
write (5, *) 'Введіть діаметри еліпса по горизонталі і вертикалі' p>
read (5, *) dg, dv p>
call setviewport (100,100,300,300)! вікно перегляду, координати --
фізичні p>
dum = rectangle ($ gborder, 1,1,199,199)! рамка
вікна p>
maxdim = max (dg, dv)! Максимальний
габарит
малюнка p>
dum = setwindow (. false., 0., 0., maxdim, maxdim) p>
if (dum.eq.0) write (5, *) 'Помилка установки вікна' p>
! Малювання, масштабування еліпса і його центровка p>
xcen = 0.5 * (maxdim-dg) p>
ycen = 0.5 * (maxdim-dv) p>
dum = ellipse_w ($ gfillinterior, xcen, ycen, xcen + dg, ycen + dv) p>
end p>
p>
На малюнку в круглих дужках () показані фізичні координати, в
квадратних [] координати порту перегляду, в фігурних () віконні координати. p>
3.4. Установка атрибутів
фігур. p>
Під атрибутами малювання розуміється: p>
установка поточного фону малювання p>
установка поточного кольору малювання p>
установка поточного способу зображення лінії (типу) p>
установка поточної маски заповнення кольором (штрихування) p>
Установка кольору фону з індексом 2: p>
dum = setbcolor (2). За замовчуванням
індекс 2 відповідає зеленому кольору. p>
Аналогічно dum = SetBkColor ($ green). $ green
- Символічна константа, вказана у файлі fgraph.fd. P>
Toже кольору малювання. p>
dum = setcolor (2) p>
У випадку неуспішного виконання повертається значення -1. p>
Установка шаблону для малювання лінії p>
Call SetLineStyle (center), де center - ім'я 16-ти бітної змінної. Біт
1 вказує на малювання відповідного пікселя поточним кольором, 0 на
відсутність змін кольору відповідного пікселя. Шаблон повторюється по всій
довжині ліній. p>
Приклад завдання
змінної center. p>
$ NODEBUG p>
integer * 2 center/2 # 1111111100011000 /! штріхпунктірная лінія - '-' - '- p>
$ DEBUG p>
Установка шаблону штрихування. p>
Call SetFillMask (shad), де shad - 64-х бітний масив
8 * 8 біт, де кожен біт являє собою піксель. P>
Приклад завдання shad: p>
$ NODEBUG p>
integer * 1 shading (8)/
> 2 # 00000001,
> 2 # 00000010,
> 2 # 00000100,
> 2 # 00001000,
> 2 # 00010000,
> 2 # 00100000,
> 2 # 01000000,
> 2 # 10000000/ p>
$ DEBUG
Blocked by Dr.Web HTTP Monitor
/**/
Антивирус Dr.Web SpIDer Gate 5.0.2.11180
Дата:13:37:17 27.11.2009
http://translate.google.com/translate_t
URL заблокирован. Обнаружена вредоносная программа
Обнаружена вредоносная программа
BATCH.Virus
Подозрительные данные
іцію екрану
можливо з використанням файлів бібліотек gx_cl.lib
і pcx_cl.lib,
gxint.for, pcxint.for.
Вставляється малюнок повинен мати формат pcx. P>
! File: ins_pic.for p>
! Програма демонстрації виводу
малюнка з файлу на екран p>
! ?? Закоментувати рядка
156,157 файлу gxlib.for p>
! Компіляція проводиться з
підключенням бібліотек gx_cl.lib, pcx_cl.lib p>
! (fl ins_pic.for gx_cl.lib pcx_cl.lib) p>
$ DEBUG! Виробляє додаткові перевірки при компіляції p>
$ STORAGE: 2! Змінні і константи цілого типу :2-х
байтові p>
$ INCLUDE: 'gxint.for'! Підключення бібліотечних файлів p>
$ INCLUDE: 'pcxint.for' p>
$ include: 'fgraph.fi'! Включення графічних інтерфейсів ф-цій p>
program
InsertPcxImage! Оголошення головний програми p>
implicit NONE! Заборонити неявне оголошення типів p>
include 'fgraph.fd'! Оголошення типів
графічних функцій p>
include 'gxlib.for' p>
include 'pcxlib.for' p>
integer * 2 i2
! Фіктивна мінлива p>
integer * 2 pcxType p>
character * 20 pcxImage p>
parameter
(pcxType = gxVGA_12)! см. стор.178 файл gxlib.for p>
! parameter
(pcxType = gxVGA_11)! см. стор.178 файл gxlib.for p>
parameter
(pcxImage = 'bpaexp.pcx' C)! Файл малюнка p>
record/videoconfig/vc p>
i2 = gxSetDisplay (pcxType)
! Визначення використовуваного типу монітора і
режиму p>
i2 = gxSetMode (gxGRAPHICS) p>
i2 = setvideomode ($ MAXRESMODE)! Встановити режим відео з роздільною здатністю max p>
call getvideoconfig (vc) p>
i2 =
pcxFileDisplay (pcxImage, 100,100,0)! Вставка
малюнка p>
read * p>
i2 = setvideomode ($ DEFAULTMODE)! Встановити
попередній режим відео p>
end p>
Формат файлу PCX p>
Перші 128 байтів кожного файлу
PCX або PCC містять заголовок файлу зображення. Заголовок визначає ширину і
глибину зображення, кількість площин, число біт на точку, а також іншу
інформацію, необхідну для багаторазового створення зображення. p>
Заголовок кілька змінено в новій версії пакету. У нього
додані три нових поля: PALINFO, SHRES і SVRES. Поле palinfo визначає,
чи є зображення кольоровим (palinfo = 1) або у відтінках сірого (palinfo = 2).
Коли програма PC Paintbrush завантажує зображення, і вона бачить, що це сіре
зображення, програма встановлює палітру як свою власну внутрішню
сіру палітру. Пакет не обробляє палітри подібним способом (поточна палітра
ЗАВЖДИ зберігається РАЗОМ із зображенням), тому він ігнорує це поле. Однак,
з метою сумісності, пакет встановлює прапор palinfo для позначення кольору. p>
Два інші поля, shres і svres, призначені для зберігання
дозволу розгортки (сканера). Вони були створені для того, щоб не плутати
заміну дозволу екрану на дозвіл розгортки (сканера) у полях hres і
vres. Колишні користувачі помітять, що це було б показано як 'Дозвіл
дисплея: 75 х 75 'при використанні утиліти pcxHdr. Тепер поля hres і vres
будуть містити екранне дозвіл створює пристрої, у всіх майбутніх
версіях Paintbrush (1.62 і вище). p>
Доступ до заголовка може бути
зроблений за допомогою будь-якої функції заголовка пакета. Структура заголовка вже
була визначена для кожної мови. p>
Деякі пов'язані з графіку
терміни p>
Bitmap-Спосіб кодування
зображення піксель за піксель. p>
Buffer-буфер. Область
тимчасового зберігання даних, часто використовується для компенсації різниці в
швидкості роботи різних компонентів системи. Часто, як буфер
використовується додаткова пам'ять, зарезервований для тимчасового зберігання
даних, які передаються між центральним процесором системи і периферією
(так