Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 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)
3503format('iiix,iiiy—Координатыточкинаэкране'/
*'iiix—растетслеванаправо,iiiy—сверхувниз'/
*'itoch—номервводимойточкинарисунке')
c4—задаемтемнокрасныйцвет
dummy=setcolor(4)
51
write(2,*)
*'Отметьтекнопкойmouseначалокоординатграфика'
melm=1
callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2)
read(okno1,*)
cwrite(2,*)'Нажмите"Enter"'
j1=iiix
i1=iiiy
write(2,*)'j1,i1=',j1,i1
write(2,*)'ОтметьтекнопкойmouseточкунаосиOX'
callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2)
read(okno1,*)

52 Глава 2. Обработка графической информации
cwrite(2,*)'Нажмите"Enter"'
j2=iiix
i2=iiiy
write(2,*)'j2,i2=',j2,i2
write(2,*)'ОтметьтекнопкойmouseточкунаосиOY'
callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2)
read(okno1,*)
cwrite(2,*)'Нажмите"Enter"'
j3=iiix
i3=iiiy
write(2,*)'j3,i3=',j3,i3
cКонецвводакоординатопорныхточек
cПереходкреальнымкоординатамточекграфика
if(j2.le.j1)j2=j1+1
ci—номерстрокинаэкране,растетсверхувниз
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,ysred,ymax,ymin,i'
write(21,*)

Пример 4. Определение координат точек графика
cПереборточекграфика
do1100ii=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
33format(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
1100continue
cКонецзаписькоординатточекграфикавфайл21
write(2,*)'Координатыточекграфика(min,max)'
write(2,*)'xgrmax=',xgrmax
write(2,*)'xgrmin=',xgrmin
write(2,*)'ygrmax=',ygrmax
write(2,*)'ygrmin=',ygrmin
53
cВыходизпрограммы
2222continue
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*4RGB,Red,Green,Blue
cПереборточекрисунка
do1j=j1,j2
do1i=i1,i2
cНашлиномерцветаточкирисунка(RGB)
RGB=getpixelRGB(j,i)
cНашлиотдельныекомпонентыцветовэтойточки
callintegertoRGB(RGB,Red,Green,Blue)
55
Компоненты цветов Red, Green, Blue принимают значения от 0 до 255.
Точно угадать эти сочетания на рисунке вобщем виде достаточно сложно. Поэтому впроцессе выделения линии графика на поле рисунка можно использовать некоторый диапазон сочетаний, т.е., вместо операторов
непосредственного сравнения номера цвета
if(icwet.ne.icwetgraf)goto771
следует использовать операторы сравнения полутонов внекотором диапазоне изменений цвета, например
if((Red.lt.200.and.Red.gt.210)
*.and.(Green.lt.100.and.Green.gt.120)
*.and.(Blue.lt.160.and.Blue.gt.190))goto771
иделать несколько попыток выделения графика споследовательным сужением диапазона компонент цвета, пока не будет достигнута достаточная четкость сканированной линии графика или на нем не появятся разрывы линии. Естественно, вместо цифровых границ можно использовать переменные, значения которых можно считывать из настроечного
файла, либо спомощью мыши выбрать цвет точки на графике, определить его компоненты, задать допуски изменений этих компонент иосуществлять сканирование графика.

56 Глава 2. Обработка графической информации
Пример 5. Подпрограммы рисования символов
ci—номерцвета,
cxo,yo—координатыусловногоцентрасимвола,
cddx,ddy—характерныеразмерысимвола.
cРисуемкрест
subroutinekrest(i,xo,yo,ddx,ddy)
usedib
record/wxycoord/s
doubleprecisionxo,yo,ddx,ddy,x1,x2,y1,y2
integer*2jj,dummy
jj=i
dummy=setcolor(int2(jj))
cОпределяемкоординатыкрайнихточеккреста
x1=xo-ddx
x2=xo+ddx
y1=yo-ddy
y2=yo+ddy
cПереместилисьвточкуx1,y1(нерисуя)
callmoveto_w(x1,y1,s)
cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2
dummy=lineto_w(x2,y2)
cПереместилисьвточкуx1,y2(нерисуя)
callmoveto_w(x1,y2,s)
cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y1
dummy=lineto_w(x2,y1)
return
end
cРисуемдиагональныйкрест
subroutinekrestdiag(i,xo,yo,ddx,ddy)
usedib

Пример 5. Подпрограммы рисования символов
record/wxycoord/s
doubleprecisionxo,yo,ddx,ddy,x1,x2,y1,y2
integer*2jj,dummy
cОпределяемкоординатыкрайнихточеккреста
x1=xo-ddx
x2=xo+ddx
y1=yo-ddy
y2=yo+ddy
cПереместилисьвточкуx1,y1(нерисуя)
callmoveto_w(x1,y1,s)
cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y2
dummy=lineto_w(x2,y2)
cПереместилисьвточкуx1,y2(нерисуя)
callmoveto_w(x1,y2,s)
cИзэтойточкирисуемпрямуюлиниюдоточкиx2,y1
dummy=lineto_w(x2,y1)
return
end
57
cРисуемтреугольник
subroutinetreugolnik1(i,xo,yo,dx,dy,metka)
usedib
record/wxycoord/s
doubleprecisionxo,yo,dx,dy,x1,x2,x3,y1,y2,y3
integer*2dummy,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(нерисуя)
callmoveto_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)goto100
cЗаливкатреугольниказаданнымцветом
BOUNDARY=i
xc=xo+dx*0.1d0
yc=yo+dy*0.25d0
dummy=FLOODFILL_w(Xc,Yc,BOUNDARY)
100continue
return
end
cРисуемперевернутыйтреугольник
subroutinetreugolnik2(i,xo,yo,dx,dy,metka)
usedib
record/wxycoord/s
doubleprecisionxo,yo,dx,dy,x1,x2,x3,y1,y2,y3
integer*2dummy,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(нерисуя)
callmoveto_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)goto100
cЗаливкатреугольниказаданнымцветом
BOUNDARY=i
xc=xo-dx*0.1d0
yc=yo-dy*0.25d0
dummy=FLOODFILL_w(Xc,Yc,BOUNDARY)
100continue
return
end
cРисуемромб
subroutineromb(i,xo,yo,dx,dy,dl,metka)
usedib
record/wxycoord/s
doubleprecisionxo,yo,dx,dy,dl
*,x1,y1,x2,y2,x3,y3,x4,y4,xc,yc
integer*2dummy,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(нерисуя)
callmoveto_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)goto100
cЗаливкаромбазаданнымцветом
BOUNDARY=i
xc=xo+dx*0.1d0
yc=yo+dy*0.25d0
dummy=FLOODFILL_w(Xc,Yc,BOUNDARY)
100continue
return
end
cРисуемстрелку
subroutinestrela(i,xo,yo,dx,dy,dl)
usedib
record/wxycoord/s
doubleprecisionxo,yo,dx,dy,dl,xk,yk,x1,x2,y1,y2
integer*2jj
jj=i
dummy4=setcolor(int2(jj))
callmoveto_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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
