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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 4. Определение координат точек графика
read(13,*)y2 write(2,*)'tochka2—точканаосиOX' write(2,*)'x2,y2=',x2,y2 read(13,*) read(13,*)x3 read(13,*)y3 write(2,*)'tochka3—точканаосиOY' write(2,*)'x3,y3=',x3,y3
write(2,*) write(2,*)'Вводкоординатточексэкрана' write(2,*)'1—НачалосистемыкоординатOXY' write(2,*)'2—точканаосиOX' write(2,*)'3—точканаосиOY' write(2,3503) 3503format('iiix,iiiy—Координатыточкинаэкране'/ *'iiix—растетслеванаправо,iiiy—сверхувниз'/ *'itoch—номервводимойточкинарисунке') c4—задаемтемнокрасныйцвет dummy=setcolor(4)
51
write(2,*) *'Отметьтекнопкойmouseначалокоординатграфика' melm=1 callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2) read(okno1,*) cwrite(2,*)'Нажмите"Enter"' j1=iiix i1=iiiy write(2,*)'j1,i1=',j1,i1
write(2,*)'ОтметьтекнопкойmouseточкунаосиOX' callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2) read(okno1,*)
52 Глава 2. Обработка графической информации
cwrite(2,*)'Нажмите"Enter"' j2=iiix i2=iiiy write(2,*)'j2,i2=',j2,i2
write(2,*)'ОтметьтекнопкойmouseточкунаосиOY' callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2) read(okno1,*) cwrite(2,*)'Нажмите"Enter"' j3=iiix i3=iiiy write(2,*)'j3,i3=',j3,i3
cКонецвводакоординатопорныхточек
cПереходкреальнымкоординатамточекграфика if(j2.le.j1)j2=j1+1 ci—номерстрокинаэкране,растетсверхувниз if(i1.le.i3)i1=i3+1 ox=(x2-x1)/(j2-j1) oy=(y1-y3)/(i1-i3) write(2,*)'j2,j1=',j2,j1 write(2,*)'ox=(x2-x1)/(j2-j1),x2,x1=',ox,x2,x1 write(2,*)'i3,i1=',i3,i1 write(2,*)'oy=(y1-y3)/(i1-i3),y3,y1=',oy,y3,y1 xgrmax=-1.0d30 xgrmin=1.0d30 ygrmax=-1.0d30 ygrmin=1.0d30
cЗаписьреальныхкоординатточекграфикавфайл21 write(21,*) write(21,*) *'x,ysred,ymax,ymin,i' write(21,*)
Пример 4. Определение координат точек графика
cПереборточекграфика do1100ii=1,nwrem j=jjx(ii) i=iiy(ii) xgrii=x1+(j-j1)*ox ygrii=y1+(i-i1)*oy xgr(ii)=xgrii ygr(ii)=ygrii cкрайниеточкилинииграфикаповысоте(ygriimax,ygriimin) ygriimax=y1+(iiymax(ii)-i1)*oy ygriimin=y1+(iiymin(ii)-i1)*oy write(21,33)xgrii,ygrii,ygriimin,ygriimax,ii 33format(4g12.4,i8) cОпределениеразмеровграфика(min,max) if(xgrmax.lt.xgrii)xgrmax=xgrii if(xgrmin.gt.xgrii)xgrmin=xgrii if(ygrmax.lt.ygrii)ygrmax=ygrii if(ygrmin.gt.ygrii)ygrmin=ygrii 1100continue cКонецзаписькоординатточекграфикавфайл21 write(2,*)'Координатыточекграфика(min,max)' write(2,*)'xgrmax=',xgrmax write(2,*)'xgrmin=',xgrmin write(2,*)'ygrmax=',ygrmax write(2,*)'ygrmin=',ygrmin
53
cВыходизпрограммы 2222continue stop end
Обозначения цвета графика (используется впеременных icwetgraf,
icwetgrafnow):
0— черный 1— темно-синий
54 Глава 2. Обработка графической информации
2— зеленый
3— голубой
4— темно-красный
5— фиолетовый
6— желто-зеленый
7, 8— оттенки серого цвета
9— ярко-синий
10— ярко-зеленый
11— светло-голубой
12— красный
13— фиолетовый
14— желтый
15— белый
16— черный
Более полная и подробная информация о процедурах управления цветом приводится вописаниях языка FORTRAN.
Замечание. При желании текстовые сообщения можно выводить всвободную часть экрана, чтобы не затенять график. Но каждое следу­ющее сообщение нужно сдвигать, чтобы не было наложений надписей друг на друга. Другой вариант— перед выводом очередного сообщения заранее очистить поле экрана, например нарисовав вэтом месте белый прямоугольник. Этот вариант показан в следующих примерах. Вывод сообщений на экран имеет смысл при эпизодическом применении про­граммы, когда пользователь не помнит всю последовательность дей­ствий. Если программа используется часто, то лишние надписи следует убирать, чтобы они не отвлекали внимание. При сложном алгоритме действий целесообразно создать отдельный файл с подробными ин­струкциями для пользователя.
Программа предназначена для обработки 16 цветных рисунков. Если требуется обработка рисунков сполутонами, рисунков соттенками се­рого цвета, то операторы выделения точек графика на поле рисунка сле­дует изменить. Например, можно использовать следующие операции при обработке полутонового цветного графика:
Пример 4. Определение координат точек графика
integer*4RGB,Red,Green,Blue cПереборточекрисунка do1j=j1,j2 do1i=i1,i2 cНашлиномерцветаточкирисунка(RGB) RGB=getpixelRGB(j,i) cНашлиотдельныекомпонентыцветовэтойточки callintegertoRGB(RGB,Red,Green,Blue)
55
Компоненты цветов Red, Green, Blue принимают значения от 0 до 255.
Точно угадать эти сочетания на рисунке вобщем виде достаточно слож­но. Поэтому впроцессе выделения линии графика на поле рисунка мож­но использовать некоторый диапазон сочетаний, т.е., вместо операторов непосредственного сравнения номера цвета
if(icwet.ne.icwetgraf)goto771
следует использовать операторы сравнения полутонов внекотором диа­пазоне изменений цвета, например
if((Red.lt.200.and.Red.gt.210) *.and.(Green.lt.100.and.Green.gt.120) *.and.(Blue.lt.160.and.Blue.gt.190))goto771
иделать несколько попыток выделения графика споследовательным су­жением диапазона компонент цвета, пока не будет достигнута достаточ­ная четкость сканированной линии графика или на нем не появятся раз­рывы линии. Естественно, вместо цифровых границ можно использо­вать переменные, значения которых можно считывать из настроечного файла, либо спомощью мыши выбрать цвет точки на графике, опреде­лить его компоненты, задать допуски изменений этих компонент иосу­ществлять сканирование графика.
56 Глава 2. Обработка графической информации
Пример 5. Подпрограммы рисования символов
ci—номерцвета, cxo,yo—координатыусловногоцентрасимвола, cddx,ddy—характерныеразмерысимвола.
cРисуемкрест
subroutinekrest(i,xo,yo,ddx,ddy) usedib record/wxycoord/s doubleprecisionxo,yo,ddx,ddy,x1,x2,y1,y2 integer*2jj,dummy jj=i dummy=setcolor(int2(jj)) cОпределяемкоординатыкрайнихточеккреста x1=xo-ddx x2=xo+ddx y1=yo-ddy y2=yo+ddy cПереместилисьвточкуx1,y1(нерисуя) callmoveto_w(x1,y1,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2 dummy=lineto_w(x2,y2) cПереместилисьвточкуx1,y2(нерисуя) callmoveto_w(x1,y2,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y1 dummy=lineto_w(x2,y1) return end
cРисуемдиагональныйкрест
subroutinekrestdiag(i,xo,yo,ddx,ddy) usedib
Пример 5. Подпрограммы рисования символов
record/wxycoord/s doubleprecisionxo,yo,ddx,ddy,x1,x2,y1,y2 integer*2jj,dummy cОпределяемкоординатыкрайнихточеккреста x1=xo-ddx x2=xo+ddx y1=yo-ddy y2=yo+ddy cПереместилисьвточкуx1,y1(нерисуя) callmoveto_w(x1,y1,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2 dummy=lineto_w(x2,y2) cПереместилисьвточкуx1,y2(нерисуя) callmoveto_w(x1,y2,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y1 dummy=lineto_w(x2,y1) return end
57
cРисуемтреугольник
subroutinetreugolnik1(i,xo,yo,dx,dy,metka) usedib record/wxycoord/s doubleprecisionxo,yo,dx,dy,x1,x2,x3,y1,y2,y3 integer*2dummy,BOUNDARY cНашликоординатыугловтреугольника x1=xo+dx y1=yo-0.4d0*dy x2=xo y2=yo+1.4d0*dy x3=xo-dx y3=y1 cПереместилисьвточкуx1,y1(нерисуя) callmoveto_w(x1,y1,s)
58 Глава 2. Обработка графической информации
cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2 dummy=lineto_w(x2,y2) cИзэтойточкирисуемпрямуюлиниюдоточкиx3,y3 dummy=lineto_w(x3,y3) cИзэтойточкирисуемпрямуюлиниюдоточкиx1,y1 dummy=lineto_w(x1,y1) if(metka.eq.0)goto100 cЗаливкатреугольниказаданнымцветом BOUNDARY=i xc=xo+dx*0.1d0 yc=yo+dy*0.25d0 dummy=FLOODFILL_w(Xc,Yc,BOUNDARY) 100continue return end
cРисуемперевернутыйтреугольник
subroutinetreugolnik2(i,xo,yo,dx,dy,metka) usedib record/wxycoord/s doubleprecisionxo,yo,dx,dy,x1,x2,x3,y1,y2,y3 integer*2dummy,BOUNDARY cНашликоординатыугловтреугольника x1=xo+dx y1=yo+0.4d0*dy x2=xo y2=yo-1.4d0*dy x3=xo-dx y3=y1 cПереместилисьвточкуx1,y1(нерисуя) callmoveto_w(x1,y1,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2 dummy=lineto_w(x2,y2)
Пример 5. Подпрограммы рисования символов
cИзэтойточкирисуемпрямуюлиниюдоточкиx3,y3 dummy=lineto_w(x3,y3) cИзэтойточкирисуемпрямуюлиниюдоточкиx1,y1 dummy=lineto_w(x1,y1) if(metka.eq.0)goto100 cЗаливкатреугольниказаданнымцветом BOUNDARY=i xc=xo-dx*0.1d0 yc=yo-dy*0.25d0 dummy=FLOODFILL_w(Xc,Yc,BOUNDARY) 100continue return end
cРисуемромб
subroutineromb(i,xo,yo,dx,dy,dl,metka) usedib record/wxycoord/s doubleprecisionxo,yo,dx,dy,dl *,x1,y1,x2,y2,x3,y3,x4,y4,xc,yc integer*2dummy,BOUNDARY cНашликоординатыугловромба x1=xo+dx y1=yo x2=xo y2=yo-dy x3=xo-dx y3=yo x4=xo y4=yo+dy cПереместилисьвточкуx1,y1(нерисуя) callmoveto_w(x1,y1,s) cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2 dummy=lineto_w(x2,y2)
59
60 Глава 2. Обработка графической информации
cИзэтойточкирисуемпрямуюлиниюдоточкиx3,y3 dummy=lineto_w(x3,y3) cИзэтойточкирисуемпрямуюлиниюдоточкиx4,y4 dummy=lineto_w(x4,y4) cИзэтойточкирисуемпрямуюлиниюдоточкиx1,y1 dummy=lineto_w(x1,y1) if(metka.eq.0)goto100 cЗаливкаромбазаданнымцветом BOUNDARY=i xc=xo+dx*0.1d0 yc=yo+dy*0.25d0 dummy=FLOODFILL_w(Xc,Yc,BOUNDARY) 100continue return end
cРисуемстрелку
subroutinestrela(i,xo,yo,dx,dy,dl) usedib record/wxycoord/s doubleprecisionxo,yo,dx,dy,dl,xk,yk,x1,x2,y1,y2 integer*2jj jj=i dummy4=setcolor(int2(jj)) callmoveto_w(xo,yo,s) dxdl=dl*dx dydl=dl*dy xk=dxdl+xo yk=dydl+yo dummy=lineto_w(xk,yk) x1=xk-0.2d0*dxdl+0.05d0*dydl y1=yk-0.2d0*dydl+0.05d0*dxdl x2=xk-0.2d0*dxdl-0.05d0*dydl y2=yk-0.2d0*dydl-0.05d0*dxdl
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]