Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 10. Рисование графиков (фрагменты программы)
cОбозначениеосиOZ,цифрысправаотсетки
if(xzm.eq.0.0d0.and.yzm.eq.0.0d0)goto9918
x3=xmax+10*ddx-zmax*xzm
y3=0.0d0+25*ddy-zmax*yzm
callmoveto_w(x3,y3,s)
calloutgtext(Zzagol)
9918continue
cОбозначениялинийподграфиками
if(mez.ne.0)goto56
if(ngraf.eq.1)goto56
do55jgra=ngraf1,ngraf2
ijzw=ijzwZ(jgra)
if(mezw.eq.0)ijzw=0
dummy=setcolor(ijzw)
x2=xmin+0.12d0*xxx*jgra
y2=ymin-0.10d0*yyy
x2=x2-15*ddx
callmoveto_w(x2,y2,s)
x1=x2
y1=y2
wx1=x1+dddx
wy1=y1+dddy
wx2=x1-dddx
wy2=y1-dddy
cКруг(закрашен)
if(jgra.eq.1)
*dummy=ellipse_w($gllinterior,wx1,wy1,wx2,wy2)
131
cПрямоугольник(закрашен)
if(jgra.eq.2)
*dummy=rectangle_w($gllinterior,wx1,wy1,wx2,wy2)
cКрест
if(jgra.eq.3)callkrest(ijzw,x1,y1,dddx,dddy)
cРомб(закрашен)

132 Глава 2. Обработка графической информации
if(jgra.eq.4)callromb(ijzw,x1,y1,dddx,dddy,raz,1)
cТреугольник
if(jgra.eq.5)calltreugolnik1(ijzw,x1,y1,dddx,dddy,0)
cТреугольник(закрашен)
if(jgra.eq.6)calltreugolnik1(ijzw,x1,y1,dddx,dddy,1)
cПеревернутыйтреугольник
if(jgra.eq.7)calltreugolnik2(ijzw,x1,y1,dddx,dddy,0)
cПеревернутыйтреугольник(закрашен)
if(jgra.eq.8)calltreugolnik2(ijzw,x1,y1,dddx,dddy,1)
cРомб
if(jgra.eq.9)callromb(ijzw,x1,y1,dddx,dddy,raz,0)
cДиагональныйкрест
if(jgra.eq.10)callkrestdiag(ijzw,x1,y1,dddx,dddy)
x2=x2-10*ddx
callmoveto_w(x2,y2,s)
x2=x2+15*ddx
dummy=lineto_w(x2,y2)
cРисуемтолстуюлинию
if(metol.le.0)goto25001
x1=x2-15*ddx
y1=y2
cВставляемпромежуточныеточки
do25450jjjj=1,140
x1p=(x2*(140-jjjj)+x1*(jjjj-1))/139.0d0
y1p=(y2*(140-jjjj)+y1*(jjjj-1))/139.0d0
wx1=x1p+ddx*metol*0.01d0
wy1=y1p+ddy*metol*0.01d0
wx2=x1p-ddx*metol*0.01d0
wy2=y1p-ddy*metol*0.01d0
cРисуемэллипсысцентрамивэтихточках
dummy=ellipse_w($gllinterior,wx1,wy1,wx2,wy2)
25450continue
25001continue

Пример 10. Рисование графиков (фрагменты программы)
wx2=x2-3*ddx
wy2=y2-3*ddy
callmoveto_w(wx2,wy2,s)
cСтавимнарисункеномерграфика
3330format(i2)
write(nomj,3330)jgra
calloutgtext(nomj)
55continue
56continue
cКонецобозначенийлинийподграфиками
3040format(i4)
325format(f5.2)
c0—задаличерныйцвет
dummy=setcolor(0)
cРисуемзаголовокпоосиX
x3=xmin+0.02d0*xxx
y3=ymin-ddy*1.4d0*(mefont+15)-zmin*yzm
callmoveto_w(x3,y3,s)
calloutgtext(Xzagol)
133
cВыбираемшрифт
widfont1(1)=''
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
cВыводимнарисунокзначенияminиmaxX
calloutgtext('min=')
write(nle18,33335)Xgrafmin
calloutgtext(nle18)
calloutgtext(',max=')

134 Глава 2. Обработка графической информации
write(nle18,33335)Xgrafmax
calloutgtext(nle18)
cВыбираемшрифт(наклонныесимволы)
widfont1(1)='i'
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
cРисуемзаголовокпоосиY
y3=y3-ddy*0.5d0*(mefont+15)
callmoveto_w(x3,y3,s)
calloutgtext(Yzagol)
cВыбираемшрифт(прямыесимволы)
widfont1(1)=''
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
cВыводимнарисунокзначенияminиmaxY
calloutgtext('min=')
write(nle18,33335)Ygrafmin
calloutgtext(nle18)
calloutgtext(',max=')
write(nle18,33335)Ygrafmax
calloutgtext(nle18)
cВыбираемшрифт(наклонныесимволы)
widfont1(1)='i'

Пример 10. Рисование графиков (фрагменты программы)
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
cРисуемзаголовокпоосиZ
y3=y3-ddy*0.5d0*(mefont+15)
callmoveto_w(x3,y3,s)
calloutgtext(Zzagol)
cВыбираемшрифт(прямыесимволы)
widfont1(1)=''
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
135
cВыводимнарисунокзначенияminиmaxZ
calloutgtext('min=')
write(nle18,33335)Zgrafmin
calloutgtext(nle18)
calloutgtext(',max=')
write(nle18,33335)Zgrafmax
calloutgtext(nle18)
33335format('',f16.2,'')
cФормируемимяфайлавкоторомдолженхранитьсярисунок
c(например)
write(nwida,330)ngraf2
30format(i5)
330format(i3)
130format(i1)

136 Глава 2. Обработка графической информации
cЗаписьнадискфайласрисункомвформате*.BMPсименем,
cсодержащимсявпеременной«lm»е
i4=saveimage_w(lm,xx1,yy2,xx2,yy1)
return
end
Некоторые варианты оформления графиков показаны на рис. 3—6.
Иногда возникает необходимость использования нескольких шрифтов для оформления рисунка. Эта задача может быть решена различными способами. Наиболее общий способ — это использование набора
готовых заставок, которые выводятся внужное место экрана. Если выводимые тексты содержат много символов и эти символы часто меняют-
Рис. 3. Графики 2D. Обозначения графиков под рисунком

Пример 10. Рисование графиков (фрагменты программы)
Рис. 4. Графики 2D. Обозначения графиков на рисунке
137
Рис. 5. График 3D. Выделение опорных точек

138 Глава 2. Обработка графической информации
Рис. 6. График 3D. Заполнение замкнутых областей графиков штриховкой, вы-
деление опорных точек
ся, то может быть использован вариант программы со сменой шрифта по
условной метке.
cФрагментыпрограммы.Вариантсразличнымишрифтами
cтекста
character(12)Xzagol,Yzagol,Zzagol
character(12)Xzago,Yzago,Zzago
character(1)Xza(12),Yza(12),Zza(12)
equivalence(Xza(1),Xzago)
equivalence(Yza(1),Yzago)
equivalence(Zza(1),Zzago)

Пример 10. Рисование графиков (фрагменты программы)
cЗадалитекст,например:
Yzagol='Qy,Н'
cЗадаемшрифтыснаклоннымисимволами
widfont1(1)='i'
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
Yzago=Yzagol
cПереборсимволовзаголовка
do7654i=1,12
cНаходимвтекстесимвол','
if(Yza(i).ne.',')goto7650
cВданномпримересимволзапятойслужитметкойдлясмены
cшрифта.Задаемшрифтсвертикальнымисимволами
widfont1(1)=''
if(metipfont.eq.0)dummy=setfont("t'courier'"//widfont)
if(metipfont.eq.1)dummy=setfont("t'TimesNew
*Roman'"//widfont)
if(metipfont.eq.2)dummy=setfont("t'ArialBlack'"//
*widfont)
7650continue
cВыводимсимволнаэкран
calloutgtext(Yza(i))
7654continue
cКонецвариантсразличнымишрифтамитекста
139
Заметим, что можно предложить множество вариантов оформле-
ния графиков, в том числе с использованием готовых элементов.
В частности, можно использовать файлы с фотографиями формата
*.BMP в качестве фона для графиков. Они могут применяться вкачестве маркеров линий графиков, в качестве заголовков, обозначений
осей координат и т.п. С этой целью можно использовать процедуры

140 Глава 2. Обработка графической информации
загрузки на экран заставок, представленные впримере 8. Например,
оператор
i4=loadimage(zastawka(jjj),knopx(jjj),knopy(jjj))
загружает рисунок, график, фотографию (файл *.BMP) с именем, указанным всимвольной переменной zastawka(jjj), на экран. Координаты угловой точки заставки на экране задаются значениями переменных
knopx(jjj) иknopy(jjj). Используя простые приемы обработки заставок (изменения цвета, форм, размеров, приемы наложения кадров),
представленные впримере 8, можно создать весьма сложные иразнообразные варианты оформления рисунка.
Пример 11. Использование буфера
для хранения и повторного вывода
на экран части рисунка
cПриведеныфрагментыпрограммы.
cПример.Рисованиеосейкоординатвсменяющихсякадрах.
cВыделяемпамятьдляхранениярисункавбуфере
cinteger(1),allocatable::buffer1(:),buffer2(:)
integer(1)buffer1(10000),buffer2(80)
cНапервомшагеповремени(nt=1)рисуемосикоординат
cизапоминаемрисуноквбуфере
if(nt.ne.1)goto88880
x1=x20-xxx*0.1d0
y1=y20-yyy*0.1d0
x3=x1-raz*1.1d0
y3=y1-raz*1.1d0
x4=x1+raz*1.2d0
y4=y1+raz*1.1d0
x33=x3
y44=y4
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
