Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 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
usedib
cПоумолчаниюиспользуемдвойнуюточностьпеременных
implicitreal*8(a-h,o-z)
integer*2dummy,maxx,maxy,BOUNDARY
cВыделилимассивыдляхранениякоординатточекрисунка
real*8xgr(1000000),ygr(1000000)
cВыделилисимвольныепеременныедляхраненияименфайла
character(62)Risstarii,lm1
datalm1
*/"Risunok\lm1.bmp"/
cОкно
integer*4i4,okno,okno1,iiix,iiiy
record/wxycoord/s
record/xycoord/tts
type(xycoord)pt
common/oknoris/okno
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
character(5)bufff1,bufff2,buf1,buf2
common/buffer/bufff1,bufff2
character(5)simnomprot
cРазмерыэкранамонитораЭВМпогоризонталиивертикали
c(например,ix2=1600,iy2=1200)
integer*2ix2,iy2,j,i
integer*2jxmin,jxmax,iymin,iymax

44 Глава 2. Обработка графической информации
type(qwinfo)qw
logical*2true/.true./
cРабочиемассивы
dimensionjjx(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='Grak-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Задалитекстовоеокно
callsettextwindow(1,1,46,100)
i4=focusqq(qwin$framewindow)
cОткрываемokno1
okno1=3
OPEN(UNIT=3,FILE='user')
i4=setwsizeqq(okno1,qw)
callsetviewport(0,0,ix2,iy2)
cСчитываемимярисункаизфайла13всимвольнуюпеременную
cRisstarii
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Задаемстильлиний
callsetlinestyle(#ffff)
cБелыйэкран(очисткаэкрана)
c15—белыйцвет
dummy=setcolor(15)
cРисуембелыйпрямоугольниквовсеокно
dummy=rectangle_w($gllinterior,x1,y2,x2,y1)
cОпределениеразмероврисункаRisstarii
write(2,*)
cОткрываемфайлсрисунком(сномером1)
open(1,le=Risstarii,form='binary',iostat=iche)
ci4=0—приуспешномвыполнении
if(iche.eq.0)write(2,*)'Найден',Risstarii
if(iche.ne.0)write(2,*)'Ненайден',Risstarii
cЕслифайлнеоткрыт,тоидемнавыход
if(iche.ne.0)goto2222
cОпределяемразмерынайденногорисунка(считываемиз
cзаголовкафайла*.BMP)
read(1)ch
read(1)ix
read(1)iy
close(1)
cЗакрылифайл1срисунком
write(2,*)
write(2,*)'ШиринарисункаRisstariiix=',ix

Пример 4. Определение координат точек графика
write(2,*)'ВысотарисункаRisstariiiy=',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)
ci4=0—приуспешномвыполнении
cЗадаембелыйцвет
dummy=setcolor(15)
cРисуембелыйпрямоугольниквовесьэкран,еслиненашли
cзаставку
if(i4.ne.0)dummy=rectangle_w($gllinterior,x1,y2,x2,y1)
47
cВыводимнаэкрансообщение
callmoveto_w(0.8d0,0.7d0,s)
cЗадаемновыйцвет
dummy=setcolor(icwetgrafnow)
cВыводимтекстовоесообщение
cwrite(okno1,3505)
write(2,3505)
3505format('Отметьтекнопкойmouseлевыйверхполяграфика')
melm=1
cВызываемподпрограммуработысmouse
callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2)
read(okno1,*)
cwrite(2,*)'Нажмите"Enter"'
cВызываемаяподпрограммаsubmousпередаеткоординаты

48 Глава 2. Обработка графической информации
c(iiix,iiiy)выделеннойнаэкранеточки.Одинизвариантов
cтакойподпрограммыприведенвпримере7.
jxmin=iiix
iymin=iiiy
write(2,3506)
3506format('Отметьтекнопкойmouseправыйнизполяграфика')
callsubmous(okno1,melm,xx1,xx2,yy1,yy2,ix2,iy2)
read(okno1,*)
cwrite(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Переборточекэкранапогоризонтали
do772j=jxmin,jxmax
isum=0
ksum=0
kkk=0
imin=iymax
imax=iymin

Пример 4. Определение координат точек графика
cПереборточекэкранаповертикали
do771i=iymin,iymax
cОпределилицветточкианализируемогополяэкрана
icwet=getpixel(j,i)
cОбходимточкидругогоцвета
if(icwet.ne.icwetgraf)goto771
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
771continue
cКонецперебораточекэкранаповертикали
cЗапоминаемкоординатысреднейточкиповертикали,
cатакжеточекmaxиminповысоте(толщине)линииграфика
if(kkk.eq.0)goto772
i=isum/ksum+1
nwrem=nwrem+kkk
jjx(nwrem)=j
iiy(nwrem)=i
iiymax(nwrem)=imax
iiymin(nwrem)=imin
772continue
cКонецпереборточекэкранапогоризонтали
cКонецопределениякоординатточекграфиканарисунке*.BMP
49
cЗаданныйграфикотсутствует.Идемнавыход
if(nwrem.eq.0)write(2,*)
*‘Точкизаданногоцветанарисункененайдены’
if(nwrem.eq.0)goto2222
cПроверка.Рисуемнайденныйграфикдругимцветомповерх
cстарого

50 Глава 2. Обработка графической информации
cicwetgrafnow—новыйзаданныйцветсканированногографика
dummy=setcolor(icwetgrafnow)
j=jjx(1)
i=iiy(1)
cПеревеликурсорвначальнуюточку
callmoveto(j,i,tts)
cПеребираемточкиграфика
do1800ii=1,nwrem
j=jjx(ii)
i=iiy(ii)
cРисуемотрезкипрямыхлиниймеждусоседнимиточками
cграфика
dummy=lineto(j,i)
1800continue
cКонецпроверкиправильностисканирования.
cЗадержкарисунканаэкране
read(okno1,*)
cwrite(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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
