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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 11. Использование буфера
дляхранения иповторного вывода на экран части рисунка
cВариант.Определяемразмерыбуферадляхраненияданных cimsize=imagesize_w(x3,y4,x4,y3) cВыделяемпамять callocate(buffer(imsize)) cwrite(2,350)imsize c350format(//'imsize=',i8//)
c0—черныйцвет dummy=settextcolor(0) ij=0 dummy=setcolor(0) cНачалокоординат callmoveto_w(x1,y1,s) calloutgtext('0') cap1-ap9—компонентыматрицыпреобразованиякоординат c(используютсяприповоротеизображенияобъектанаэкране)
cОсьx x2=x1+ap1*raz+xxx*0.005d0 y2=y1+ap2*raz+yyy*0.005d0 cТочкарасположенияобозначенияоси(уконцастрелки) callmoveto_w(x2,y2,s) calloutgtext('x') callstrela(ij,x1,y1,ap1,ap2,raz)
141
cОсьy x2=x1+ap4*raz+xxx*0.005d0 y2=y1+ap5*raz+yyy*0.005d0 cТочкарасположенияобозначенияоси(уконцастрелки) callmoveto_w(x2,y2,s) calloutgtext('y') callstrela(ij,x1,y1,ap4,ap5,raz)
cОсьz x2=x1+ap7*raz+xxx*0.005d0 y2=y1+ap8*raz+yyy*0.005d0
142 Глава 2. Обработка графической информации
cТочкарасположенияобозначенияоси(уконцастрелки) callmoveto_w(x2,y2,s) calloutgtext('z') callstrela(ij,x1,y1,ap7,ap8,raz)
cЗапомнилиполученныйрисуноквбуфере(buffer1) callgetimage_w(x3,y4,x4,y3,buffer1) cКонецобработкирисунканапервомшагеповремени(nt=1)
88880continue cНадругихшагахповременирисунокнесоздаем,аужеготовый cизвлекаемизбуфера(buffer1)ивыводимнаэкран callputimage_w(x33,y44,buffer1,$gpset)
Использование буфера для хранения иповторного вывода на экран части рисунка целесообразно при наличии большого количества повто­ряющихся фрагментов рисунка. Каждый фрагмент отдельно рисуется и отдельно запоминается в свой буфер и, далее, может быть выведен многократно вразличных областях экрана (впримере координаты вы­вода задаются параметрами x33,y44).
Если программа используется достаточно часто, а рисуемый фраг­мент сложен имногократно повторяется, то имеет смысл запоминать его не только вбуфере оперативной памяти, но ина диске, откуда он может извлекаться при повторных запусках программы. Например:
cЗаписьнадискфайласрисункомвформате*.BMPсименем, cсодержащимсявпеременной«lm» i4=saveimage_w(lm,xx1,yy2,xx2,yy1) cЗагрузкасдискафайласрисункомвформате*.BMP i4=loadimage(lm,0,0) cИмяфайламожетбытьзаданонепосредственно i4=loadimage('20.bmp',50,50) cЗдесьверхнийлевыйуголзаставкисдвинутповертикалии cгоризонтали(50,50).
Пример 12. Рисование поверхности объекта (фрагменты программы)
143
Сдвиг может быть как положительным, так иотрицательным (вверх-
вниз, вправо-влево). При излишне большом сдвиге заставка выходит за рамки рисуемого поля ина экране не отображается.
Заметим, что стандартные программы работают с буфером прямо-
угольной формы. При желании программист сам может запоминать вотдельных массивах ивыводить на экран отдельные точки (спомощью функции setpixelrgb) или группы точек, соответствующие изображе­нию объекта (как это показано впримере 8). Вэтом случае не обязатель­но запоминать всю прямоугольную область рисунка, вкоторой находит­ся объект. Достаточно хранить число точек, цвет икоординаты точек объекта. Вряде случаев этот вариант оказывается более удобным.
Пример 12. Рисование поверхности объекта
(фрагменты программы)
cРисованиесетки(m*n),узлыкоторойрасполагаютсяна cповерхностиобъекта. cКоординатыузловнедеформированнойсеткиxyz(m*n*3). cКомпонентыперемещенийузловсеткиw(m*n*3). crazw—масштабныйкоэффициент c(задаетсяпривизуализациипрогибов,формколебаний).
k1=-m cПереборлинийпооднойкоординатесетки do8853i=1,nm1 k1=k1+m cПереборлинийподругойкоординатесетки do8854j=1,mm1 cРассматриваемячейку(четырехугольник)приузлесетки ji=j+k1 ji2=ji+m ji3=ji2+1 ji4=ji+1
144 Глава 2. Обработка графической информации
cПоложениясоседнихузловдеформированнойсетки(втекущий cмоментвремени) x1=xyz(ji)+w(ji)*razw y1=xyz(ji+mn)+w(ji+mn)*razw x2=xyz(ji2)+w(ji2)*razw y2=xyz(ji2+mn)+w(ji2+mn)*razw x3=xyz(ji3)+w(ji3)*razw y3=xyz(ji3+mn)+w(ji3+mn)*razw x4=xyz(ji4)+w(ji4)*razw y4=xyz(ji4+mn)+w(ji4+mn)*razw cПереносимточкувузелскоординатамиx1,y1 callmoveto_w(x1,y1,s) cРисуемпрямуюлиниюдоточкискоординатамиx2,y2 dummy=lineto_w(x2,y2) cРисуемпрямуюлиниюдоточкискоординатамиx3,y3 dummy=lineto_w(x3,y3) cРисуемпрямуюлиниюдоточкискоординатамиx4,y4 dummy=lineto_w(x4,y4) cРисуемпрямуюлиниюдоточкискоординатамиx1,y1 dummy=lineto_w(x1,y1) 8854continue 8853continue
Данный вариант предусматривает рисование четырехугольника для каждого узла сетки. Нетрудно заметить, что вэтом случае большинство линий рисуется дважды. Можно предложить другие, более быстрые ва­рианты рисования сетки, например использующие ломаные линии, «змейку», сплайны при построении координатных линий с последую­щей окантовкой сетки. Вместо операции последовательного рисования прямых, соединяющих узлы сетки, можно использовать процедуру ри­сования замкнутого многоугольника (функция POLYGON, пример 10). Од­нако трудоемкость этой операции обычно невелика. Поэтому нет осо­бой необходимости воптимизации вычислений. Она заметно возраста­ет, если вместо сетки требуется построить полутоновое изображение поверхности объекта.
Пример 12. Рисование поверхности объекта (фрагменты программы)
cРисованиеповерхностиобъекта(фрагментыпрограммы). cФормируемместнуювнешнююнормалькповерхности. cx1,…,z3-координатысоседнихузловсетки cрассматриваемогоэлементаповерхности. cВектор1местногобазисаповерхности sx1=x2-x1 sy1=y2-y1 sz1=z2-z1 cВектор2местногобазисаповерхности sx2=x3-x2 sy2=y3-y2 sz2=z3-z2 cВекторместнойнормали(находимвекторноепроизведение cбазисныхвекторов) wnormalx=sy1*sz2-sz1*sy2 wnormaly=sz1*sx2-sx1*sz2 wnormalz=sx1*sy2-sy1*sx2 cКвадратвектораместнойнормаликрисуемойповерхности wnormalk=(wnormalx**2+wnormaly**2+wnormalz**2) cКоэффициентотражениясветаотповерхности otrag=wnormalz*wnormalz/wnormalk
145
cЗаданиецветасучетомвлияниякоэффициентаотражения c(пример) kkk=255*otrag cКомпонентыцвета.Синиеполутона(пример) iiist=rgbtointeger(0,0,kkk) cКомпонентыцвета.Серыеполутона(пример) ciiist=rgbtointeger(kkk,kkk,kkk) iii=setcolorrgb(iiist)
cПереборвсехточекрисуемогоэлементапанели. cКоординатырисуемойточкиxt,yt,zt ix=xt iy=yt
146 Глава 2. Обработка графической информации
cПроверяемусловиявыходаточкизаграницырисунка(ix,iy) if(ix.le.0.or.ix.gt.1600)goto1141 if(iy.le.0.or.iy.gt.1200)goto1141 cПроверяемположениерисуемойточкипоглубинерисунка c(вкаждойточкеэкранаизображаемтольконаиболееблизкуюк cнамточку,остальныеточкинерисуем,онизатененыболее cблизкимиточкамииостаютсяневидимыми) if(zt.lt.zris(ix,iy))goto1141 cЗапомнилинаиболееблизкуюизнарисованныхвэтойточке cэкрана(ix,iy)точкуповерхностиобъектапоглубинерисункав cмассивеzris(ix,iy) zris(ix,iy)=zt cВариант.Рисуемточкусвыборомцвета cdummy=setpixelrgb(ix,iy,iii) cВариант.Рисуемточкунеменяяцвет(онодиндлявсехточек cэлементапанелииопределяетсяодинразпередраскраской cэлементапанели) dummy=setpixel(ix,iy) 1141continue cКонецперебораточекрисуемойобластипанели 141continue
Замечания. Вслучае необходимости базисные векторы ивектор мест­ной нормали могут быть вычислены более точно с помощью сплайнов или более сложных разностных выражений, могут использоваться ба­зисные векторы ивекторы нормалей соседних узлов сетки, могут приме­няться приемы интерполяции, сглаживания идр.
Если рассматривается замкнутый объем сневидимой внутренней по­верхностью ивнешняя местная нормаль к поверхности направлена от наблюдателя, расположенного вне этого объема, то данный элемент по­верхности не будет виден. Соответственно, нет необходимости вего по­строении, так как он будет затенен более близкими элементами.
При рассмотрении крупной расчетной сетки более гладкие изобра­жения могут быть получены, если находить координаты точек икомпо-
Пример 12. Рисование поверхности объекта (фрагменты программы)
147
ненты цветов промежуточных точек интерполяцией координат и цве­тов базовых точек ближайших элементов поверхности. Этот вариант сложно применять, если на объекте имеются ребра, тени, участки раз­ного цвета.
Если положение источника света другое или источников света не-
сколько либо имеет значение спектральный состав (цвет) каждого источ­ника света, то коэффициент отражения вычисляется исуммируется от­дельно для каждой компоненты цвета каждого источника. Вэтом случае могут быть использованы операторы
cОпределениеразличныхкоэффициентовотражения(пример) kkkR=kkkR+R255*otragk kkkG=kkkG+G255*otragk kkkB=kkkB+B255*otragk cЗаданиецветасучетомвлиянияразличныхкоэффициентов cотражения(пример) iiist=rgbtointeger(kkkR,kkkG,kkkB)
Такой вариант может применяться при оформлении художествен-
ных изображений. Он существенно более сложен и затратен, так как требует трассировки лучей— к каждой точке рисуемого объекта мыс­ленно направляется луч, он многократно отражается, преломляется, расщепляется, пока не доходит до источника света. При рисовании эти лучи отслеживаются вобратном порядке (от источника света кнаблю­дателю). Многократные вычисления коэффициентов преломлений и переотражений достаточно трудоемки (учитываются яркость источ­ников света, зеркальное идиффузное отражение, преломленный идиф­фузно пропущенный сквозь прозрачные объекты свет идр.) [8]. Соот­ветственно, помимо геометрических форм ирасположения объектов, следует дополнительно задавать отражающие свойства и степень про­зрачности поверхностей применительно к каждой компоненте света, задавать положения испектральный состав источников света ит.п. Та­кого рода построения подробно рассмотрены в специализированной литературе.
148 Глава 2. Обработка графической информации
Рис. 7. Распределение коэффициента давления по верхней и нижней поверхно-
стям крыла
В технических приложениях перечисленные приемы используются не часто, так как они весьма трудоемки ине очень востребованы. Кроме того, излишне сложное изображение иобилие мелких подробностей от­влекают внимание от важных деталей исследуемого процесса. Это меша­ет проведению анализа полученного решения. Поэтому в инженерной практике нашли применение более простые варианты построения изо­бражений. В качестве примера на рис. 2 показан один из вариантов представления форм упругих колебаний конструкции, на рис. 7— один из вариантов представления распределений коэффициента давления по поверхности крыла.
В таких случаях подробное изображение объекта и всевозможные высокохудожественные эффекты оказываются лишними. Чаще исполь­зуются еще более простые иболее традиционные формы представления результатов исследований ввиде скелетных линий, двумерных графиков (рис. 8) ит.п. Они позволяют не только рассмотреть общую картину яв­ления, но иполучить количественные оценки.
Пример 12. Рисование поверхности объекта (фрагменты программы)
149
Рис. 8. Распределение местных чисел Маха в сечении крыла
Объект может быть показан на фоне заставки (рис. 9), которая выво-
дится на экран до построения рисуемых поверхностей. Можно исполь­зовать несколько заставок, сдвинутых относительно друг друга (иначе последняя рисуемая заставка перекроет все предыдущие).
При построении многослойного изображения вначале рисуются
(или выводятся на экран заставки) наиболее удаленные объекты, затем показываются более близкие объекты. Это позволяет автоматически убирать затененные точки. Другим, более универсальным способом яв­ляется учет координат точек поверхности объекта по глубине рисунка. В этом случае объекты и их отдельные элементы могут выводиться на экран влюбой последовательности, так как при рисовании нового объ­екта для каждой точки экрана скоординатами (x,y) предварительно про­веряется координата рассматриваемой точки объекта по глубине рисун­ка (z), ирисуются только более близкие кнаблюдателю точки. Вприме-
150 Глава 2. Обработка графической информации
Рис. 9. Использование заставки для получения заднего плана рисунка (см. цв.
рис. на форзаце в конце книги)
ре 12 эту проверку выполняет оператор if(zt.lt.zris(ix,iy)) go to
1141. На рис. 9 приведен вариант реализации таких способов: вначале на экран выведена заставка, затем по точкам, сучетом глубин их располо­жения нарисован объект.
В примерах показаны приемы программирования, реализующие лишь часть графических процедур FORTRANа. Изобразительные воз­можности средств FORTRANа позволяют решить практически все во­просы визуализации результатов расчетных и(или) экспериментальных исследований, представляющих интерес втехнических приложениях.
Существуют приемы, позволяющие значительно повысить эффек­тивность программ. В частности, можно хранить координаты сеток икомпоненты векторов нормалей кповерхностям, нарисованные объ­екты можно хранить ввиде заставок иповторно использовать при рисо­вании следующих кадров, при повторных запусках программ, при пере­даче вдругие программы. При наличии достаточного количества заста­вок можно создавать реалистические изображения и фильмы без
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]