Курсовая на тему Графическое программирование на Ms Fortran
Работа добавлена на сайт bukvasha.net: 2015-06-29Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
|
Закрашивание замкнутой области. 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:
Для использования шрифтов необходимы следующие действия: выбор (регистрация) шрифта установка текущего шрифта из регистра отображение текста текущим шрифтом выгрузка шрифтов из памяти 4.2.1. Выбор шрифта Процесс регистрации шрифта представляет собой загрузку в ОЗУ соответствующего .fon файла Синтаксис: dum = RegisterFonts (filename), где: filename – имя fon файла с необязательным указанием пути доступа. Возможно использование подстановочных символов * и ?. Пример: Dum = RegisterFonts (‘C:MSLIBFONT*.fon‘) Вывести текст шрифтом может только функция outgtext. В случае ошибки возвращается следующее значения: - 1 нет заданного файла или каталога - 2 один или более FON файлов является двоичными - 3 один или более FON файлов испорчены. 4.2.2. Установка шрифта Установка шрифта производится функцией SetFont Пример: Dum = SetFont (“t‘Roman’h18”) После выполнения функции setfont установленный шрифт становится текущим, т.е. он действует до тех пор, пока не будет установлен другой шрифт (либо не отменен видеорежим, либо не окончена программа). Текущим может быть только один шрифт. Параметры функции setfont задаются строкой символов, которые определяют желаемые характеристики выбранного шрифта. Порядок параметров не имеет значения.
Функция 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: 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, ее integer getch [C, alias:'_getch'] ! атрибутов, типов формальных end ! параметров program Demonstr_devide_screen ! Объявление головной программы implicit NONE ! Запретить неявное объявление типов integer *2 i2 ! Фиктивная переменная 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*2 nx,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 = ‘программа демонстрации’ call outtext (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, ее integer getch [C, alias:'_getch'] ! атрибутов, типов формальных параметров end program Demonstr_Text_Window ! Объявление головной программы implicit NONE ! Запретить неявное объявление типов integer *2 i2 ! Фиктивная переменная 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 real A(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) call OutText(' Ведите элемент массива А'//vl) ValElem=' ' ! Символьное обнуление m=0 ! Числовое обнуление do k=1,24 ! Количество вводимых цифр i2=getch() ! Возврат кода нажатой клавиши if (i2.eq.13) exit ! Нажат ввод if (i2.eq.27) return ! Нажата Esc (выход из программы) call GetTextPosition(rc) ! Возврат текущей позиции call SetTextPosition(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 удаляется end if ! последний введенный символ (запись в буфер пробела) 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 ! (fl ins_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). Когда программа PC Paintbrush загружает изображение, и она видит, что это серое изображение, программа устанавливает палитру как свою собственную внутреннюю серую палитру. Пакет не обрабатывает палитры подобным способом (текущая палитра ВСЕГДА хранится ВМЕСТЕ с изображением), поэтому он игнорирует это поле. Однако, в целях совместимости, пакет устанавливает флаг 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 (столбцы) и к размеру отводимой памяти на представление глубины цвета. Стандартная видеопамять VGA 640 пикселов на 480 пикселов и, обычно, с глубиной представления цвета 8 бит. Чем выше разрешение, тем более детально изображение, тем больше нужно хранить о нем информации. Но не вся хранимая информация может быть отображена на дисплее. Texture-двумерное изображение хранящееся в памяти компьютера или графического акселератора в одном из пиксельных форматов. В случае хранения в сжатом виде на дисках компьютера, текстура может представлят собой обычный бит-мап который мы привыкли видеть в форматах bmp, jpg, gif и т.д. Перед использованием, текстура разворачивается в памяти и может занимать объем в десятки раз больше первоначального размера. Существует порядка двух десятков более или менее стандартизированных пиксельных форматов текстур. |