Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 11. Использование буфера
дляхранения иповторного вывода на экран части рисунка
cВариант.Определяемразмерыбуферадляхраненияданных
cimsize=imagesize_w(x3,y4,x4,y3)
cВыделяемпамять
callocate(buffer(imsize))
cwrite(2,350)imsize
c350format(//'imsize=',i8//)
c0—черныйцвет
dummy=settextcolor(0)
ij=0
dummy=setcolor(0)
cНачалокоординат
callmoveto_w(x1,y1,s)
calloutgtext('0')
cap1-ap9—компонентыматрицыпреобразованиякоординат
c(используютсяприповоротеизображенияобъектанаэкране)
cОсьx
x2=x1+ap1*raz+xxx*0.005d0
y2=y1+ap2*raz+yyy*0.005d0
cТочкарасположенияобозначенияоси(уконцастрелки)
callmoveto_w(x2,y2,s)
calloutgtext('x')
callstrela(ij,x1,y1,ap1,ap2,raz)
141
cОсьy
x2=x1+ap4*raz+xxx*0.005d0
y2=y1+ap5*raz+yyy*0.005d0
cТочкарасположенияобозначенияоси(уконцастрелки)
callmoveto_w(x2,y2,s)
calloutgtext('y')
callstrela(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Точкарасположенияобозначенияоси(уконцастрелки)
callmoveto_w(x2,y2,s)
calloutgtext('z')
callstrela(ij,x1,y1,ap7,ap8,raz)
cЗапомнилиполученныйрисуноквбуфере(buffer1)
callgetimage_w(x3,y4,x4,y3,buffer1)
cКонецобработкирисунканапервомшагеповремени(nt=1)
88880continue
cНадругихшагахповременирисунокнесоздаем,аужеготовый
cизвлекаемизбуфера(buffer1)ивыводимнаэкран
callputimage_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).
crazw—масштабныйкоэффициент
c(задаетсяпривизуализациипрогибов,формколебаний).
k1=-m
cПереборлинийпооднойкоординатесетки
do8853i=1,nm1
k1=k1+m
cПереборлинийподругойкоординатесетки
do8854j=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
callmoveto_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)
8854continue
8853continue
Данный вариант предусматривает рисование четырехугольника для
каждого узла сетки. Нетрудно заметить, что вэтом случае большинство
линий рисуется дважды. Можно предложить другие, более быстрые варианты рисования сетки, например использующие ломаные линии,
«змейку», сплайны при построении координатных линий с последующей окантовкой сетки. Вместо операции последовательного рисования
прямых, соединяющих узлы сетки, можно использовать процедуру рисования замкнутого многоугольника (функция POLYGON, пример 10). Однако трудоемкость этой операции обычно невелика. Поэтому нет особой необходимости воптимизации вычислений. Она заметно возрастает, если вместо сетки требуется построить полутоновое изображение
поверхности объекта.

Пример 12. Рисование поверхности объекта (фрагменты программы)
cРисованиеповерхностиобъекта(фрагментыпрограммы).
cФормируемместнуювнешнююнормалькповерхности.
cx1,…,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Компонентыцвета.Серыеполутона(пример)
ciiist=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)goto1141
if(iy.le.0.or.iy.gt.1200)goto1141
cПроверяемположениерисуемойточкипоглубинерисунка
c(вкаждойточкеэкранаизображаемтольконаиболееблизкуюк
cнамточку,остальныеточкинерисуем,онизатененыболее
cблизкимиточкамииостаютсяневидимыми)
if(zt.lt.zris(ix,iy))goto1141
cЗапомнилинаиболееблизкуюизнарисованныхвэтойточке
cэкрана(ix,iy)точкуповерхностиобъектапоглубинерисункав
cмассивеzris(ix,iy)
zris(ix,iy)=zt
cВариант.Рисуемточкусвыборомцвета
cdummy=setpixelrgb(ix,iy,iii)
cВариант.Рисуемточкунеменяяцвет(онодиндлявсехточек
cэлементапанелииопределяетсяодинразпередраскраской
cэлементапанели)
dummy=setpixel(ix,iy)
1141continue
cКонецперебораточекрисуемойобластипанели
141continue
Замечания. Вслучае необходимости базисные векторы ивектор местной нормали могут быть вычислены более точно с помощью сплайнов
или более сложных разностных выражений, могут использоваться базисные векторы ивекторы нормалей соседних узлов сетки, могут применяться приемы интерполяции, сглаживания идр.
Если рассматривается замкнутый объем сневидимой внутренней поверхностью ивнешняя местная нормаль к поверхности направлена от
наблюдателя, расположенного вне этого объема, то данный элемент поверхности не будет виден. Соответственно, нет необходимости вего построении, так как он будет затенен более близкими элементами.
При рассмотрении крупной расчетной сетки более гладкие изображения могут быть получены, если находить координаты точек икомпо-

Пример 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а позволяют решить практически все вопросы визуализации результатов расчетных и(или) экспериментальных
исследований, представляющих интерес втехнических приложениях.
Существуют приемы, позволяющие значительно повысить эффективность программ. В частности, можно хранить координаты сеток
икомпоненты векторов нормалей кповерхностям, нарисованные объекты можно хранить ввиде заставок иповторно использовать при рисовании следующих кадров, при повторных запусках программ, при передаче вдругие программы. При наличии достаточного количества заставок можно создавать реалистические изображения и фильмы без
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
