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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 3. Поиск данных вфайле стаблицами
read(sstroka,*,err=105,iostat=iche)namedir cСэтимименемсоздаетсянадискеноваядиректория t=MAKEDIRQQ(namedir) cФормируемимяфайла(lm),соответствующееэтойдиректории cОткрываемвсозданнойдиректориифайлсэтимименем open(UNIT=8,le=lm,STATUS='NEW',iostat=iche)
41
Если впрограмме используется только одно имя директории, то оно
может быть задано непосредственно, например
t=MAKEDIRQQ('c:\g\Prr\Form\Whoddd')
Удаление директорий ифайлов также может быть выполнено про-
граммными средствами (DELDIRQQ, DELFILESQQ), но эти варианты вряд ли стоит рекомендовать, так как существует опасность случайного удале­ния нужной информации. Поэтому целесообразно удалять директории ифайлы только после предварительного просмотра их содержания.
Желательно предусмотреть разделение в структуре программы вы-
числительных операций и операций обмена с внешними носителями данных. Это позволяет с меньшими затратами перенастраивать про­граммы вслучаях изменений форматов файлов ипроцедур их обработки при переходе на другие версии программного обеспечения.
ГЛАВА 2
ОБРАБОТКА ГРАФИЧЕСКОЙ ИНФОРМАЦИИ
Существует множество публикаций, вкоторых рассматриваются эффек­тивные методы обработки графической информации. Часть из них при­водится всписке литературы. Они ориентированы на максимальное ис­пользование имеющихся ресурсов ЭВМ. К сожалению, оптимальные решения жестко связаны с особенностями архитектуры ЭВМ и опера­ционной системы. При переходе на другие ЭВМ идругие операционные системы нередко приходится изменять значительную часть прикладной программы. Если при этом не обеспечиваются какие-либо дополни­тельные преимущества (например, от черно-белого рисунка перешли кцветному, многократно повысили скорость обработки кадра идр.), то необходимость переписывания иповторной отладки старой программы вызывает негативную реакцию.
При разработке вычислительных программ стремятся обеспечить их высокую производительность и надежность. Важно иметь устойчивый код программы, который не требует подстройки под очередные измене­ния ЭВМ ипрограммного обеспечения. Такой вариант может быть реа­лизован на языке FORTRAN. Он вменьшей степени подвержен измене­ниям, так как значительную часть возникающих вопросов решают раз­работчики новых версий трансляторов. Естественно, что при этом имеют место дополнительные преобразования, несколько снижается скорость выполнения программы, ограничиваются возможности управ­ления периферийными устройствами ЭВМ.
Многие виды обработки графической информации могут быть вы­полнены средствами языка FORTRAN. Подробные сведения о таких процедурах приведены вцитируемой литературе. Некоторые из приемов демонстрируются на следующих примерах. Приведены фрагменты про-
Пример 4. Определение координат точек графика
43
грамм, использующих наиболее простые средства языка. Заметим, что всовременных версиях FORTRANа существуют процедуры, позволяю­щие создавать более совершенные структуры программ.
Пример 4. Определение координат точек
графика
cВариантобработкирисунка*.BMP(16цветов)
cПодключилиграфическиемодулиязыкаFORTRAN usedib cПоумолчаниюиспользуемдвойнуюточностьпеременных implicitreal*8(a-h,o-z) integer*2dummy,maxx,maxy,BOUNDARY cВыделилимассивыдляхранениякоординатточекрисунка real*8xgr(1000000),ygr(1000000) cВыделилисимвольныепеременныедляхраненияименфайла character(62)Risstarii,lm1 datalm1 */"Risunok\lm1.bmp"/ cОкно integer*4i4,okno,okno1,iiix,iiiy record/wxycoord/s record/xycoord/tts type(xycoord)pt common/oknoris/okno common/melmmm/melmmm,iiix,iiiy,ix2,iy2 character(5)bufff1,bufff2,buf1,buf2 common/buffer/bufff1,bufff2 character(5)simnomprot cРазмерыэкранамонитораЭВМпогоризонталиивертикали c(например,ix2=1600,iy2=1200) integer*2ix2,iy2,j,i integer*2jxmin,jxmax,iymin,iymax
44 Глава 2. Обработка графической информации
type(qwinfo)qw logical*2true/.true./ cРабочиемассивы dimensionjjx(1000000),iiy(1000000) *,iiymax(10000),iiymin(10000) cПеременнаядляопределенияразмеровобрабатываемого cрисунка character(18)ch
cОткрыливыходнойфайл2сименемOktgr.res OPEN(UNIT=2,FILE='Oktgr.res') cОткрылиle=13—файлданныхдлянастройкирисунка open(unit=13,le='13.txt',form='formatted', *status='old',access='sequential',iostat=iche) if(iche.ne.0) *write(2,*)'Stop!Файл13.txtотсутствует!' if(iche.ne.0)stop
cОткрыливыходныефайлыдлязаписикоординатточекграфика OPEN(UNIT=21,FILE='Grak-XY.txt',FORM='FORMATTED', *STATUS='UNKNOWN',ACCESS='SEQUENTIAL') OPEN(UNIT=22,FILE='Bufer.txt',FORM='FORMATTED', *STATUS='UNKNOWN',ACCESS='SEQUENTIAL') cСчитываниепервыхстрокфайла13,вкоторыхсодержатся cкомментарии read(13,*) read(13,*) read(13,*) read(13,*) read(13,*) cСчитываниеразмеровэкрана(указываетсявфайле13) read(13,*)ix2,iy2 write(2,*)'Размерыокнаэкранаix,iy=',ix2,iy2 ix222=ix2 iy222=iy2
Пример 4. Определение координат точек графика
cПоложениелевоговерхнегоуглаокнанаэкране qw.x=0 qw.y=0 cВысотаиширинаокна(впикселях) qw.h=iy2 qw.w=ix2 qw.type=qwin$set i4=setwsizeqq(qwin$framewindow,qw) cЗадалитекстовоеокно callsettextwindow(1,1,46,100) i4=focusqq(qwin$framewindow) cОткрываемokno1 okno1=3 OPEN(UNIT=3,FILE='user') i4=setwsizeqq(okno1,qw) callsetviewport(0,0,ix2,iy2) cСчитываемимярисункаизфайла13всимвольнуюпеременную cRisstarii read(13,'(a62)')Risstarii write(2,*)'Введеноимястарогорисунка=',Risstarii cЗадаемцветанализируемогографиканарисунке c(рисунокможетсодержатьнесколькографиковразногоцвета) read(13,*)icwetgraf write(2,*)'Цветанализируемогографика',icwetgraf cЗадаемновыйцветанализируемогографика c(дляконтроляуспешностиоперациисканирования) read(13,*)icwetgrafnow write(2,*)'Новыйцветанализируемогографика', *icwetgrafnow x1=0. x2=1. y1=0. y2=1. xx1=x1 xx2=x2
45
46 Глава 2. Обработка графической информации
yy1=y1 yy2=y2 cВыводимнаэкранokno1(онорасполагаетсяповерхдругих cокон) i4=focusqq(okno1) cАктивизировалиokno1(внемстроимграфики) i4=setactiveqq(okno1) cЗадаемокновывода dummy=setwindow(true,x1,y2,x2,y1) cЗадаемстильлиний callsetlinestyle(#ffff) cБелыйэкран(очисткаэкрана) c15—белыйцвет dummy=setcolor(15) cРисуембелыйпрямоугольниквовсеокно dummy=rectangle_w($gllinterior,x1,y2,x2,y1) cОпределениеразмероврисункаRisstarii write(2,*) cОткрываемфайлсрисунком(сномером1) open(1,le=Risstarii,form='binary',iostat=iche) ci4=0—приуспешномвыполнении if(iche.eq.0)write(2,*)'Найден',Risstarii if(iche.ne.0)write(2,*)'Ненайден',Risstarii cЕслифайлнеоткрыт,тоидемнавыход if(iche.ne.0)goto2222 cОпределяемразмерынайденногорисунка(считываемиз cзаголовкафайла*.BMP) read(1)ch read(1)ix read(1)iy close(1) cЗакрылифайл1срисунком
write(2,*) write(2,*)'ШиринарисункаRisstariiix=',ix
Пример 4. Определение координат точек графика
write(2,*)'ВысотарисункаRisstariiiy=',iy write(2,*) cПроверяемразмерырисунка.Онинедолжныпревышать cразмерыэкрана.Впротивномслучаерисунокнаэкранне cзагрузится. if(ix.gt.ix2)write(2,*)'Рисунокширеразмераэкрана!' if(iy.gt.iy2)write(2,*)'Рисуноквышеразмераэкрана!'
cЗагрузканаэкранзаставки(рисунка)сименем,содержащемсяв cсимвольнойпеременнойRisstarii.Координатылевоговерхнего cуглазаставкинаэкране(0,0) i4=loadimage(Risstarii,0,0) ci4=0—приуспешномвыполнении
cЗадаембелыйцвет dummy=setcolor(15) cРисуембелыйпрямоугольниквовесьэкран,еслиненашли cзаставку if(i4.ne.0)dummy=rectangle_w($gllinterior,x1,y2,x2,y1)
47
cВыводимнаэкрансообщение callmoveto_w(0.8d0,0.7d0,s) cЗадаемновыйцвет dummy=setcolor(icwetgrafnow) cВыводимтекстовоесообщение cwrite(okno1,3505) write(2,3505) 3505format('Отметьтекнопкойmouseлевыйверхполяграфика') melm=1 cВызываемподпрограммуработысmouse callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2) read(okno1,*) cwrite(2,*)'Нажмите"Enter"' cВызываемаяподпрограммаsubmousпередаеткоординаты
48 Глава 2. Обработка графической информации
c(iiix,iiiy)выделеннойнаэкранеточки.Одинизвариантов cтакойподпрограммыприведенвпримере7.
jxmin=iiix iymin=iiiy write(2,3506) 3506format('Отметьтекнопкойmouseправыйнизполяграфика') callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2) read(okno1,*) cwrite(2,*)'Нажмитеклавишу"Enter"'
jxmax=iiix iymax=iiiy cОграничиливведенноеполеграфикаразмеромэкрана if(jxmin.lt.0)jxmin=0 if(jxmax.gt.ix222)jxmax=ix222 if(iymin.lt.0)iymin=0 if(iymax.gt.iy222)iymax=iy222 write(2,*)'jxmin=',jxmin write(2,*)'jxmax=',jxmax write(2,*)'iymin=',iymin write(2,*)'iymax=',iymax cНарисоваликонтурпрямоугольника c(выделилинарисункеполеанализируемойчастиграфика) dummy=rectangle($gborder,jxmin,iymax,jxmax,iymin)
cРассматриваемнаэкранесокращеннуюобластьрисунка(только cполеграфика) nwrem=0 cПереборточекэкранапогоризонтали do772j=jxmin,jxmax isum=0 ksum=0 kkk=0 imin=iymax imax=iymin
Пример 4. Определение координат точек графика
cПереборточекэкранаповертикали do771i=iymin,iymax cОпределилицветточкианализируемогополяэкрана icwet=getpixel(j,i) cОбходимточкидругогоцвета if(icwet.ne.icwetgraf)goto771 cВыводимнапечатькоординатыj,iиномерцветаточкиграфика write(2,*)j,i,icwet if(imin.gt.i)imin=i if(imax.lt.i)imax=i kkk=1 isum=isum+i ksum=ksum+1 771continue cКонецперебораточекэкранаповертикали
cЗапоминаемкоординатысреднейточкиповертикали, cатакжеточекmaxиminповысоте(толщине)линииграфика if(kkk.eq.0)goto772 i=isum/ksum+1 nwrem=nwrem+kkk jjx(nwrem)=j iiy(nwrem)=i iiymax(nwrem)=imax iiymin(nwrem)=imin 772continue cКонецпереборточекэкранапогоризонтали cКонецопределениякоординатточекграфиканарисунке*.BMP
49
cЗаданныйграфикотсутствует.Идемнавыход if(nwrem.eq.0)write(2,*) *‘Точкизаданногоцветанарисункененайдены’ if(nwrem.eq.0)goto2222
cПроверка.Рисуемнайденныйграфикдругимцветомповерх cстарого
50 Глава 2. Обработка графической информации
cicwetgrafnow—новыйзаданныйцветсканированногографика dummy=setcolor(icwetgrafnow) j=jjx(1) i=iiy(1) cПеревеликурсорвначальнуюточку callmoveto(j,i,tts) cПеребираемточкиграфика do1800ii=1,nwrem j=jjx(ii) i=iiy(ii) cРисуемотрезкипрямыхлиниймеждусоседнимиточками cграфика dummy=lineto(j,i) 1800continue cКонецпроверкиправильностисканирования. cЗадержкарисунканаэкране read(okno1,*) cwrite(2,*)'Нажмите"Enter"'
cЗаписьнадискобновленногорисункасименем,указанномв cпеременнойlm1 i4=saveimage_w(lm1,xx1,yy2,xx2,yy1)
cВыборосейкоординат.Задаемопорныеточки c(считываемистинныезначениякоординатопорныхточекиз cфайла13) write(2,*) write(2,*) read(13,*) read(13,*)x1 read(13,*)y1 write(2,*)'tochka1—НачалосистемыкоординатOXY' write(2,*)'x1,y1=',x1,y1 read(13,*) read(13,*)x2
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]