Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 8. Организация режима диалога
=+d
jjjk=r*sin()*0.75/kdf
iiik=r*cos()*0.75/kdf
dummy4=setpixelrgb(jjjk+250-50*kdf,iiik+160+50*kdf,iii)
805continue
802continue
cКонецперебораточекзаставки(пример)
81
На рис. 1 приведены некоторые варианты изменений форм заставок,
которые могут быть получены спомощью представленных преобразований исходного рисунка.
Замечание. В процессе преобразований отдельные точки рисунка на
экране могут оказаться незаполненными. Для заполнения этих точек могут использоваться интерполяция по соседним точкам или повторное рисование со сдвигом на один пиксель положения заставки на экране. Более
простым выходом является применение процедур суменьшением размеров исходной заставки. Вэтом случае незаполненные точки отсутствуют.
Если рисунок заставки выполнен на одноцветном, например белом,
фоне, то точки этого фона можно исключить спомощью оператора вида
Рис. 1. Некоторые варианты преобразований форм заставок (см. цв. рис. на
форзаце в конце книги)

82 Глава 2. Обработка графической информации
if(Red1.lt.250.and.Green1.lt.250.and.Blue1.lt.250)
*dummy4=setpixelrgb(j+iwx,i+iwy,iii)
Пример использования этого приема представлен на рисунке, размещенном на форзаце в конце книги.
Переставляя строки или столбцы, можно получить зеркальное отображение рисунка относительно горизонтальной или вертикальной
плоскости. Рябь на воде можно имитировать небольшими искажениями
(искривлениями) рисунка, снижением яркости, особенно компонент
красного цвета.
cВызовфункцийпосредствомнажатиякнопкиmouseвзаданной
cточкеэкрана.
cПереборвсехнарисованныхнаэкранекнопок
do100jjj=1,nknopok
cПоискнажатойкнопки
c(курсорскоординатамиiiixиiiiyдолженрасполагаться
cвполенарисованнойнаэкранекнопки)
if(iiix.lt.knopx(jjj))goto110
if(iiix.gt.(knopx(jjj)+80))goto100
if(iiiy.lt.knopy(jjj))goto100
if(iiiy.gt.(knopy(jjj)+80))goto100
cНашлинажатуюкнопку.Выполняемзапрограммированные
cнамидействия,связанныеснажатиемданнойнарисованнойна
cэкранекнопки.Например:
cРисуемкраснуюокантовкуунажатойкнопки
c(впримерерассматриваютсякнопкиразмером80*80пикселей)
dummy=setcolor(12)
lcx=knopx(jjj)+2
rcx=knopx(jjj)+78
lcy=knopy(jjj)+2
rcy=knopy(jjj)+78
callmoveto(lcx,lcy,pt)

Пример 8. Организация режима диалога
dummy=lineto(rcx,lcy)
dummy=lineto(rcx,rcy)
dummy=lineto(lcx,rcy)
dummy=lineto(lcx,lcy)
cРисуемцентрнажатойкнопки(черныйкруг)
dummy=setcolor(0)
lcx=knopx(jjj)+15
rcx=knopx(jjj)+65
lcy=knopy(jjj)+15
rcy=knopy(jjj)+65
dummy=ellipse($gllinterior,lcx,lcy,rcx,rcy)
cРисуемкрасныйкруг
dummy=setcolor(12)
lcx=knopx(jjj)+20
rcx=knopx(jjj)+60
lcy=knopy(jjj)+20
rcy=knopy(jjj)+60
dummy=ellipse($gllinterior,lcx,lcy,rcx,rcy)
cРисуемжелтыйкруг
dummy=setcolor(14)
lcx=knopx(jjj)+25
rcx=knopx(jjj)+55
lcy=knopy(jjj)+25
rcy=knopy(jjj)+55
dummy=ellipse($gllinterior,lcx,lcy,rcx,rcy)
cЗапоминаемвфайле2номернажатойкнопки
knopkaris=jjj
write(2,*)'Номернажатойкнопкиknopkaris=',knopkaris
83
cЗадержка1000ms
callsleepqq(1000)
goto110
100continue
cКонецпереборакнопок

84 Глава 2. Обработка графической информации
110continue
1000continue
return
end
Аналогичным образом каждой нарисованной кнопке можно приписать выполнение своих операций. Для выполнения сложных процедур
можно организовать вызов подпрограмм.
Заметим, что с помощью операторов, указанных в циклах подпрограммы
do802j=j1,j2
do802i=i1,i2
……………
802continue
можно реализовать множество спецэффектов, число которых ограничено лишь фантазией программиста. Например, переставляя строки
истолбцы заставок, сжимая ирастягивая их вразных направлениях, меняя их расположение, можно изобразить качающиеся ветки деревьев,
бегущие волны, водопад, флаги идр. Имея алгоритм движения базовых
точек изображения, можно создавать фильмы, перемещая точки отдельных частей изображения всоответствии сдвижением базовых точек. Изменяя от кадра ккадру весовые коэффициенты двух заставок, можно
организовать плавный переход двух кадров (например, одно лицо на
экране плавно сменяется другим). Одновременно изменяя весовой коэффициент ирасположение заставки, можно изобразить след за быстро
перемещающимся телом и т.п. В качестве параметра времени (номера
кадра) можно использовать переменную «nt» (пример 8, с. 70), которая
может передаваться вподпрограммы ииспользоваться при выполнении
преобразований цвета игеометрических форм рисуемых объектов. Все
это можно реализовать ввиде фильма спомощью организации вывода
сформированных кадров в чередующиеся окна экрана. Используя подобные приемы, можно управлять яркостью, контрастностью, цветом
истепенью прозрачности рисунка. Например:

Пример 8. Организация режима диалога
cНачальнаясуммарнаяинтенсивностьцветов(яркость)точки
isum=Red+Green+Blue
cУвеличениеяркостиспомощьюзаданногообщегодлявсех
cточеккоэффициента
akkk=2
Red=Red*akkk
Green=Green*akkk
Blue=Blue*akkk
cУвеличениенасыщенностицветов
Red=Red**2
Green=Green**2
Blue=Blue**2
cУменьшениенасыщенностицветов
Red=Red1
Green=Green1
Blue=Blue1
Red1=Red**0.2
Green1=Green**0.2
Blue1=Blue**0.2
cВозвраткисходнойяркоститочки
isum2=Red+Green+Blue
akkk=isum/(isum2+0.00001)
Red=Red*akkk
Green=Green*akkk
Blue=Blue*akkk
cПереходксеромуцвету
isum=isum/3
Red=isum
Green=isum
Blue=isum
cПереходкчерномуцветуточкиприяркостименьшезаданного
cзначения
if(isum.gt.200)goto600
Red1=0
Green1=0
85

86 Глава 2. Обработка графической информации
Blue1=0
600continue
cСозданиемерцающегоизображения(переменнойяркостии
cцвета).Дляэтогодолжнабытьобеспеченасменавыводимыхна
cэкранкадровипередачаномеракадра(вданномслучае,nt)в
cподпрограмму.Например,
akkk1=sin(nt+0.001)
akkk2=sin(nt*2+0.001)
akkk3=sin(nt*0.5+0.001)
Red1=Red*akkk1
Green1=Green*akkk2
Blue1=Blue*akkk3
Для каждой компоненты цвета могут осуществляться свои преобразования со своими коэффициентами.
Часто интересует средняя яркость всего рисунка, ане отдельной точки. Вэтих случаях выполняются следующие действия.
1. Перебирая все точки рисунка, определяется средняя интенсивность цветов рисунка.
2. Выполняются преобразования цветов отдельных точек.
3. Определяется новая средняя интенсивность цветов точек всего
рисунка.
4. Средняя интенсивность цветов точек приводится кзаданной спомощью общего весового коэффициента.
Аналогичным образом могут изменяться интенсивности отдельных
компонент цветов точек.
Напомним, что после преобразований целесообразно делать провер-
ки выполнений ограничений:
if(Red1.lt.0)Red1=0
if(Red1.gt.255)Red1=255
if(Green1.lt.0)Green1=0
if(Green1.gt.255)Green1=255
if(Blue1.lt.0)Blue1=0
if(Blue1.gt.255)Blue1=255

Пример 8. Организация режима диалога
87
Если объект нарисован на зеленом фоне (Green2>Red2+Blue2), асам
он не содержит этот цвет, то его можно перенести вкадр слюбым другим
фоном спомощью операторов (для примера)
if(Green2.gt.(Red2+Blue2))goto83
Red1=Red2
Green1=Green2
Blue1=Blue2
83continue
Если фон сформированного программой рисунка белый
(Green2=Red2=Blue2=255), то можно выделять объект спомощью этого
условия. Но если фон получен спомощью фотографии или сканированием, то он обычно не является чисто белым иможет содержать различные оттенки. Вэтом случае условие сравнения лучше изменить на менее
жесткое, например:
if((Green2.gt.250).and.(Red2.gt.250).and.(Blue2.gt.250))
*goto83
Red1=Red2
Green1=Green2
Blue1=Blue2
83continue
Впримерах речь идет об обработке заставок внесколько этапов. Если
просто нужно нарисовать объект поверх других объектов, то достаточно
вывести в требуемое место экрана выделенную точку заставки спомощью оператора setpixelrgb (или setpixelsrgb), без применения дополнительных операций.
Нужный фрагмент рисунка может быть выделен идругими способами, например контурной линией (посредством задания переменных по
ширине рисунка границ фрагмента: i1=i1k(j) и i2=i2k(j)). В случаях
повышенной сложности фрагмента он может быть разделен на несколько частей. Еще более общим вариантом является применение «маски»
рисунка, когда каждой точке (или даже каждой компоненте цвета точки

88 Глава 2. Обработка графической информации
рисунка) задается метка (1— рисуем, 0— не рисуем), которая хранится
в отдельном массиве, например metkaR(80,80), metkaG(80,80),
metkaB(80,80). Этот прием удобен при имитации степени наклона иси-
лы удара охолст кисти скрасками при создании изображения. Для каж-
дого сочетания угла наклона и силы нажатия кисти используется своя
маска. Ее формирование может быть осуществлено сканированием от-
печатков реальной кисти висполнении реального художника.
Здесь приведены лишь некоторые простые примеры обработки рисунков. Более подробно приемы создания различных спецэффектов
рассмотрены вспециализированной литературе.
Как показывает данный пример, возможности изобразительных
средств языка FORTRAN довольно широки. Они редко используются
в полной мере при создании вычислительных программ. Это связано
с тем, что потребности большинства пользователей FORTRANа чаще
всего ограничены построением графиков сравнительно простого вида
ивыводом на экран расчетных сеток иизображений исследуемых объектов. Обычно все внимание уделяется организации вычислительного
процесса. Вопросы визуализации данных отодвигаются на второй план.
Врезультате многие возможности языка остаются не востребованными.
С помощью перечисленных приемов можно реализовать собственные варианты шрифтов текста любого языка. Для этого достаточно нарисовать (или сканировать) базовый вариант каждой буквы (каждого
символа) схорошим разрешением, например, 100×100 точек. Сохранить
его в виде файла *.BMP. В программе организовать ввод этого файла
ввиде заставки, задать высоту, ширину, наклон, искривление, угол поворота, цвет буквы. Заданные размеры должны быть меньше или равны
исходным для сохранения качества изображения. Всоответствии сэтими данными заставка преобразуется исохраняется ввиде другой заставки (вслучае ее многократного использования). Таким образом, обрабатывая каждую букву алфавита, мы, по существу, установили новый
шрифт. Далее, по кодам кнопок клавиатуры (которым мы приписали
данный символ, данный рисунок) или по введенным данным спомощью операции сравнения определяется введенный символ, после чего
в нужном поле экрана рисуется требуемая заставка, соответствующая

Пример 8. Организация режима диалога
89
этому символу. Если символов много (больше, чем число кнопок клавиатуры), то их вызов может быть осуществлен по сочетаниям кодов нескольких нажатых кнопок.
Перечисленные приемы могут быть использованы и при создании
собственных вариантов редакторов формул. Для этого достаточно создать рисунки с математическими символами (сумма, интеграл и т.п.)
иорганизовать их вывод внужном масштабе внужные позиции экрана.
Итоговое изображение части экрана снабранной формулой сохраняется
ввиде рисунка *.BMP, который далее можно включить втекстовый файл.
При желании может быть создана программа, обеспечивающая вы-
числения всоответствии снабранной формулой. Например, каждой типовой операции (и ее математическому символу) присваивается свой
код. Тогда при выполнении программы осуществляется просмотр кодов
символов внабранной формуле ив соответствии сэтими кодами внужной последовательности вызываются подпрограммы, реализующие указанные в формуле операции (интегрирование, дифференцирование,
разложение вряд ит.п.). Вывод результатов может быть осуществлен на
экран в диалоговом режиме. Таким образом, несложными средствами
языка FORTRAN могут быть созданы собственные варианты программ,
реализующие функции известных коммерческих программ. Естественно, тратить время на написание и отладку подобных программ имеет
смысл, если уже всуществующих версиях программ отсутствуют важные
для пользователя функции.
Вот пример (фрагмент) подпрограммы, вызываемой при нажатии
(левой вданном случае) кнопки mouse на экране. Аналогичным образом
нажатием кнопки можно вызывать идругие подпрограммы, которые мы
хотим использовать.
subroutinesubbb1(jjj)
usedib
implicitreal*8(a-h,o-z)
externalsubln
integer*4result,mouseevents,keystate,mxpos,mypos,unit1,
integer*4mevent

90 Глава 2. Обработка графической информации
integer*2status2,lcx,lcy,rcx,rcy
integer*2lcx2,lcy2,rcx2,rcy2
integer*2irx,iry,lrx,lry
type(xycoord)pt
record/wxycoord/s
character(20)text
character(4)nomj
character(8)nomj8
real*8x1,y1,xmin,xmax,ymin,ymax,dxkoord,dykoord,ddx,ddy
*,x2,y2
integer*2ix2,iy2
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
*,xxxmin,xxxmax,yyymin,yyymax,nomertochki
integer*4okno,okno3,okno4
common/oknoris/okno,okno3,okno4
cХранимномернажатойнарисованнойнаэкранекнопки
common/knopkaris/knopkaris
cПоложениянарисованныхнаэкранекнопок
common/knopki/knopx(100),knopy(100),nknopok
cПеременныесименамирисунков(вданномслучаеимеется3
cрисунка)
character(32)foto1,foto2,foto3
datafoto1/"foto1.bmp"/
datafoto2/"foto2.bmp"/
datafoto3/"foto3.bmp"/
cПеременнаядляопределенияразмеровобрабатываемого
cрисунка
character(18)ch
cХранимразмерырисунков
dimensionirisx(3),irisy(3)
cПоложенияверхнихлевыхугловрисунковнаэкране
integer*4iux,iuy
common/ugolris/iux(3),iuy(3)
cПеременные,используемыепривводечисел
dimensionkchis(12)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
