Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Обработка текстовой и графической информации

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 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) 805continue 802continue 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Переборвсехнарисованныхнаэкранекнопок do100jjj=1,nknopok cПоискнажатойкнопки c(курсорскоординатамиiiixиiiiyдолженрасполагаться cвполенарисованнойнаэкранекнопки) if(iiix.lt.knopx(jjj))goto110 if(iiix.gt.(knopx(jjj)+80))goto100 if(iiiy.lt.knopy(jjj))goto100 if(iiiy.gt.(knopy(jjj)+80))goto100 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 callmoveto(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($gllinterior,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($gllinterior,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($gllinterior,lcx,lcy,rcx,rcy) cЗапоминаемвфайле2номернажатойкнопки knopkaris=jjj write(2,*)'Номернажатойкнопкиknopkaris=',knopkaris
83
cЗадержка1000ms callsleepqq(1000) goto110 100continue cКонецпереборакнопок
84 Глава 2. Обработка графической информации
110continue 1000continue return end
Аналогичным образом каждой нарисованной кнопке можно припи­сать выполнение своих операций. Для выполнения сложных процедур можно организовать вызов подпрограмм.
Заметим, что с помощью операторов, указанных в циклах подпро­граммы
do802j=j1,j2 do802i=i1,i2
……………
802continue
можно реализовать множество спецэффектов, число которых ограниче­но лишь фантазией программиста. Например, переставляя строки истолбцы заставок, сжимая ирастягивая их вразных направлениях, ме­няя их расположение, можно изобразить качающиеся ветки деревьев, бегущие волны, водопад, флаги идр. Имея алгоритм движения базовых точек изображения, можно создавать фильмы, перемещая точки отдель­ных частей изображения всоответствии сдвижением базовых точек. Из­меняя от кадра ккадру весовые коэффициенты двух заставок, можно организовать плавный переход двух кадров (например, одно лицо на экране плавно сменяется другим). Одновременно изменяя весовой ко­эффициент ирасположение заставки, можно изобразить след за быстро перемещающимся телом и т.п. В качестве параметра времени (номера кадра) можно использовать переменную «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)goto600 Red1=0 Green1=0
85
86 Глава 2. Обработка графической информации
Blue1=0 600continue 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))goto83 Red1=Red2 Green1=Green2 Blue1=Blue2 83continue
Если фон сформированного программой рисунка белый (Green2=Red2=Blue2=255), то можно выделять объект спомощью этого условия. Но если фон получен спомощью фотографии или сканирова­нием, то он обычно не является чисто белым иможет содержать различ­ные оттенки. Вэтом случае условие сравнения лучше изменить на менее жесткое, например:
if((Green2.gt.250).and.(Red2.gt.250).and.(Blue2.gt.250)) *goto83 Red1=Red2 Green1=Green2 Blue1=Blue2 83continue
Впримерах речь идет об обработке заставок внесколько этапов. Если просто нужно нарисовать объект поверх других объектов, то достаточно вывести в требуемое место экрана выделенную точку заставки спомо­щью оператора 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 на экране. Аналогичным образом нажатием кнопки можно вызывать идругие подпрограммы, которые мы хотим использовать.
subroutinesubbb1(jjj) usedib implicitreal*8(a-h,o-z) externalsubln integer*4result,mouseevents,keystate,mxpos,mypos,unit1, integer*4mevent
90 Глава 2. Обработка графической информации
integer*2status2,lcx,lcy,rcx,rcy integer*2lcx2,lcy2,rcx2,rcy2 integer*2irx,iry,lrx,lry type(xycoord)pt record/wxycoord/s character(20)text character(4)nomj character(8)nomj8 real*8x1,y1,xmin,xmax,ymin,ymax,dxkoord,dykoord,ddx,ddy *,x2,y2 integer*2ix2,iy2 common/melmmm/melmmm,iiix,iiiy,ix2,iy2 *,xxxmin,xxxmax,yyymin,yyymax,nomertochki integer*4okno,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 datafoto1/"foto1.bmp"/ datafoto2/"foto2.bmp"/ datafoto3/"foto3.bmp"/ cПеременнаядляопределенияразмеровобрабатываемого cрисунка character(18)ch cХранимразмерырисунков dimensionirisx(3),irisy(3) cПоложенияверхнихлевыхугловрисунковнаэкране integer*4iux,iuy common/ugolris/iux(3),iuy(3) cПеременные,используемыепривводечисел dimensionkchis(12)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]