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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 12. Рисование поверхности объекта (фрагменты программы)
151
применения трудоемких операций рисования объектов по точкам. Все параметры процедур обработки заставок можно запоминать и хранить для повторного использования вотдельных массивах. Параметры могут изменяться по времени. Например, можно хранить координаты загруз­ки заставки на экран, координаты по глубине рисунка, ее преобразова­ния (сжатие по вертикали игоризонтали, угол поворота, коэффициенты изменений компонент цветов точек) и др. Объем этой информации на­много меньше объема фильма, даже после архивации. Но она позволяет во многих случаях обеспечить такое же качество изображения. Кроме того, изменив базовые файлы с заставками (например, фотографию осенней березы заменили фотографией зимней сосны), можно быстро, сминимальными затратами получить другое изображение. Для анима­ции изображений во многих случаях достаточно управлять координата­ми загрузки, углами поворота иразмерами заставок. Все эти процедуры легко могут быть запрограммированы на FORTRANе.
При желании можно воспроизвести понравившиеся процедуры об-
работки рисунков, реализованные в коммерческих программах (CorelDRAW, Photoshop идр.). Вэтих программах многие процедуры уже детально проработаны иусовершенствованы вмногочисленных верси­ях. Возникает лишь вопрос о целесообразности такого рода копиро­вания. Более продуктивной представляется реализация своих идей и алгоритмов, которые направлены на решение собственных задач. В частности, если ставится задача создания программы, реализующей оригинальные художественные замыслы, то имеет смысл более точного воспроизведения реальных технологий рисования свыделением отдель­ных этапов. Например:
1. Выбор цвета красок. Художники часто используют сочетания раз-
личных красок при выборе нужного цвета. Например, красный
ичерный воспроизводят коричневый цвет, синий ижелтый— зе-
леный цвет ит.п. При этом полностью краски не смешиваются.
Кисть переносит на холст случайные сочетания пятен разного
цвета, что создает требуемую фактуру изображения.
2. Выбор степени прозрачности наносимого слоя краски. Существу-
ют техники рисования, предусматривающие нанесение многочис-
ленных слоев полупрозрачных покрытий.
152 Глава 2. Обработка графической информации
3. Выбор кисти. Кисти различаются размерами, формой, жестко­стью, степенью износа. Эти параметры влияют на стиль рисова­ния, на создаваемую фактуру изображения.
4. Выбор количества краски на кисти (может использоваться «полу­сухая» кисть).
5. Выбор наклона, направления движения, силы удара кисти.
Существуют идругие особенности технологий создания изображений (покрытие лаком, искусственное состаривание, температурная обработ­ка, химическое травление, использование перьев, скребков, оригиналь­ных инструментов идр.). Не все, но многие из них можно имитировать программными средствами, в том числе с помощью перечисленных вглаве приемов. Наиболее простым вариантом получения реалистиче­ских изображений являются применение заставок, полученных сканиро­ванием фрагментов рисунков, выполненных по реальным технологиям (акварель, масло ит.п.). Применение «маски» рисунка, управление ярко­стью, контрастностью изображения, насыщенностью цвета создают до­полнительные возможности по реализации творческих замыслов автора.
Ниже приведены некоторые простые приемы оформления рисунков с помощью маркеров изаставок. Можно использовать различные ви­дызаставок имаркеров. Форму, размеры, цвета, их количество ираспо­ложение можно менять вшироких пределах. Впримерах использованы готовые изображения четырехзаставок ичетырех маркеров (вформате *.BMP). Заставки представляют собой фотографии. Их размеры не должны превышать размеры экрана. Вкачестве маркеров вданном слу­чае использованы фотографии объектов на белом фоне уменьшенного размера (80×80). Точки маркеров белого цвета на графиках не рисова­лись. Цвета, размеры иположения маркеров менялись входе выполне­ния программы. Если требуется изобразить объекты белого цвета (на­пример, ромашки, белые розы), то нужно использовать контрастный черный фон. При рисовании таких маркеров пропускаются темные точ­ки изображения спомощью оператора вида (например)
if(Red1.lt.20.and.Green1.lt.20.and.Blue1.lt.20)goto805 dummy4=setpixelrgb(jjjk+iwx,iiik+iwy,iii) 805continue
Пример 12. Рисование поверхности объекта (фрагменты программы)
Рис. 10. Графики, построенные с использованием маркеров
153
Рис. 11. Графики, построенные с вращениями маркеров вокруг базовых точек
154 Глава 2. Обработка графической информации
Рис. 12. Графики, построенные на фоне заставки
Рис. 13. Изменили заставку, добавили вращения и повторы маркеров
Пример 12. Рисование поверхности объекта (фрагменты программы)
Рис. 14. Изменили параметры вращения маркеров
155
Рис. 15. Изменили цвета маркеров
156 Глава 2. Обработка графической информации
Рис. 16. Изменили заставку на заднем плане, размеры, количество, цвета и рас-
положение маркеров
Рис. 17. Изменили заставку на заднем плане. Периодически переставляли мар-
керы графиков (см. цв. рис. на форзаце в конце книги)
Пример 12. Рисование поверхности объекта (фрагменты программы)
Подпрограмма рисования маркеров на графике с вносимыми эле-
ментами «хаоса» может иметь вид (пример)
cРисованиесимволовграфикаспомощьюмаркеров. cjgra-номерграфика, citg-номерточкиграфика, cwx1,wy1-координатыточкиграфика, cxx1,xx2,yy1,yy2-координатыокна, cpolelew,polepraw,polewerh,poleniz-поляграфика.
subroutinesimwolgraf(jgra,itg,wx1,wy1,xx1,xx2,yy1,yy2 *,polelew,polepraw,polewerh,poleniz) usedib implicitreal*8(a-h,o-z) logical*2true/.true./ integer*2dummy,maxx,maxy,BOUNDARY cразмерыэкрана(например,ix2,iy2=1600*1200) integer*2ix2,iy2 common/ekran/ix2,iy2
157
cПеременные,используемыедляуправленияцветамиточек cэкрана integer*4Red,Green,Blue integer*4RGB,Red1,Green1,Blue1,Red2,Green2,Blue2,dummy4 cРазмерымаркеровприняты80*80=6400точек integer*4colorpix1(6400),colorpix2(6400) integer*4colorpix3(6400),colorpix4(6400) cУказываемименамаркеров-файловсфотографиями cвформате.bmp character*(12)mark1,mark2,mark3,mark4 datamark1/"mark1.bmp"/ datamark2/"mark2.bmp"/ datamark3/"mark3.bmp"/ datamark4/"mark4.bmp"/
158 Глава 2. Обработка графической информации
cОпределилицветаточекмаркеров if(jgra.ne.4)goto50 if(itg.gt.2)goto50 cПереборвсехмаркеровграфиков(определяемцветаточек) do55jgr=1,4 cБелыйверхнийлевыйуголэкрана(закрасилиполемаркера) dummy=setcolor(15) i4=rectangle($gllinterior,0,81,81,0) cНарисоваливлевомверхнемуглуэкрана(0,0)маркер cдлярисованияграфика if(jgr.eq.1)i4=loadimage(mark1,0,0) if(jgr.eq.2)i4=loadimage(mark2,0,0) if(jgr.eq.3)i4=loadimage(mark3,0,0) if(jgr.eq.4)i4=loadimage(mark4,0,0) cОпределяемцветаточекмаркеранаэкране(вданномпримере c80*80=6400pixel) npix=6400 cРазмерымаркера j1=1 j2=80 i1=1 i2=80 kkkpix=0 cПереборвсехточекмаркера(нарисованноговлевомверхнем cуглуэкрана0,0) do801j=j1,j2 do801i=i1,i2 kkkpix=kkkpix+1 cНашлиномерцветаточки(RGB) RGB=getpixelRGB(j,i) cЗапомнилиэтотцветвмассивеcolorpix(6400) if(jgr.eq.1)colorpix1(kkkpix)=RGB if(jgr.eq.2)colorpix2(kkkpix)=RGB if(jgr.eq.3)colorpix3(kkkpix)=RGB if(jgr.eq.4)colorpix4(kkkpix)=RGB
Пример 12. Рисование поверхности объекта (фрагменты программы)
801continue 55continue cКонецпереборвсехмаркеровграфиков(определяемцвета cточек) 50continue
cНаходимположениеверхнеголевогоугламаркеранаграфике xxx=dabs(xx2-xx1) yyy=dabs(yy2-yy1) iwx=ix2*(polelew*xxx/(1+polelew+polepraw)+wx1)/xxx *-80/2 iwy=iy2*(yyy*(1+polewerh)/(1+polewerh+poleniz)-wy1)/yyy *-80/2 cПереборвсехточекмаркера(впримере80*80точек) kkkpix=0 cПереборточекпогоризонтали do802j=j1,j2 cПереборточекповертикали do802i=i1,i2 kkkpix=kkkpix+1
159
cНаходимкомпонентыцветовточекмаркераграфика(jgra): cRed-значениеинтенсивностикраснойкомпоненты, cGreen-значениеинтенсивностизеленойкомпоненты, cBlue-значениеинтенсивностисинейкомпонентыцветаточки. if(jgra.eq.1)RGB=colorpix1(kkkpix) if(jgra.eq.2)RGB=colorpix2(kkkpix) if(jgra.eq.3)RGB=colorpix3(kkkpix) if(jgra.eq.4)RGB=colorpix4(kkkpix)
cccДругойвариантрисованиямаркеров: citg-номерточкилинииграфика. cВариантсчередованиемразличныхмаркеровнаоднойлинии cграфика ck=itg
160 Глава 2. Обработка графической информации
c66if(k.gt.4)k=k-4 cif(k.gt.4)goto66 ccccНарисовалимаркерграфика cif(k.eq.1)RGB=colorpix1(kkkpix) cif(k.eq.2)RGB=colorpix2(kkkpix) cif(k.eq.3)RGB=colorpix3(kkkpix) cif(k.eq.4)RGB=colorpix4(kkkpix)
ccccccccccccccccccccccccccccccccccccccccc
cНашликомпонентыцветаточкимаркера callintegertoRGB(RGB,Red1,Green1,Blue1)
cИзменилицвет aaa=(iwx-350)/600. if(aaa.lt.0.75)aaa=0.75 if(aaa.gt.1.0)aaa=1.0 Red=Red1*aaa Green=Green1*aaa Blue=Blue1*aaa
cПроверяемвыполнениеограниченийдляновогоцвета if(Red.lt.0)Red=0 if(Red.gt.255)Red=255 if(Green.lt.0)Green=0 if(Green.gt.255)Green=255 if(Blue.lt.0)Blue=0 if(Blue.gt.255)Blue=255
cНовый,измененныйцветточки(iii) iii=setcolorrgb(rgbtointeger(Red,Green,Blue)) cСдвинулиположениезаставкинаэкране(j+iwx,i+iwy—новые cкоординатыточки). cНарисовалимаркервцикле15развокругбазовойточки do805kdf=1,15
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]