1
C @(#)polfil.for 19.1 (ES0-DMD) 02/25/03 14:01:08
2
C===========================================================================
3
C Copyright (C) 1995 European Southern Observatory (ESO)
5
C This program is free software; you can redistribute it and/or
6
C modify it under the terms of the GNU General Public License as
7
C published by the Free Software Foundation; either version 2 of
8
C the License, or (at your option) any later version.
10
C This program is distributed in the hope that it will be useful,
11
C but WITHOUT ANY WARRANTY; without even the implied warranty of
12
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
C GNU General Public License for more details.
15
C You should have received a copy of the GNU General Public
16
C License along with this program; if not, write to the Free
17
C Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
20
C Corresponding concerning ESO-MIDAS should be addressed as follows:
21
C Internet e-mail: midas@eso.org
22
C Postal address: European Southern Observatory
23
C Data Management Division
24
C Karl-Schwarzschild-Strasse 2
25
C D 85748 Garching bei Muenchen
27
C===========================================================================
29
SUBROUTINE POLFIL(CASE,INIM,TSTIM,IN2IM,
30
+ OUTIM,NPIX,WINDOW,THRESH,FILL)
32
C ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
35
C subroutine POLFIL version 1.00 880912
36
C subroutine ISCAN version 1.00 880912
37
C subroutine OVRLAP version 1.30 881028
38
C subroutine PROGRS version 2.20 880919
39
C subroutine MEMDSK version 1.00 891129
40
C K. Banse ESO - Garching
46
C fill pixels inside given polygon (including borderline pixels)
49
C get beginning + end of polygon per line in UP, DOWN
50
C replace all pixels inside with constant or other pixel values
53
C call as POLFIL(CASE,INIM,TSTIM,IN2IM,OUTIM,NPIX,WINDOW,THRESH,FILL)
56
C CASE: char. exp. = C for constant, I for image
57
C INIM: R*4 input image
58
C TSTIM: R*4 test image
59
C IN2IM: R*4 second input image
60
C OUTIM: R*4 output image
61
C NPIX: I*4 array NPIX of images
62
C WINDOW: I*4 array lower left + upper right corner of window
64
C THRESH: R*4 array low,high threshold for polygon detection
65
C FILL: R*4 fill value
68
C 1.00 from version 1.00 as of 860707
70
C-----------------------------------------------------------------------
76
INTEGER WINDOW(4),NPIX(2)
77
INTEGER NOLINS,NOPIX,OFF,UP,DOWN,SW,KX,JX
78
INTEGER M,NN,N,KLO,KHI,MLO,MHI,JLO,JHI
81
REAL INIM(*),TSTIM(*),OUTIM(*),IN2IM(*)
84
C initalize pointer to lower left corner of window
85
OFF = ( (WINDOW(2) - 1) * NPIX(1) ) + WINDOW(1) - 1
86
NOLINS = WINDOW(4) - WINDOW(2) + 1
87
NOPIX = WINDOW(3) - WINDOW(1) + 1
94
IF (SW.NE.0) WRITE(*,12000) (N-1)
102
DO 400, NN=OFF+1,OFF+NOPIX
104
IF ( (TSTIM(NN).GE.THRESH(1)) .AND.
105
+ (TSTIM(NN).LE.THRESH(2)) ) THEN
109
KLO = LOWUP(TSTIM,THRESH,NPIX,1,NN)
110
KHI = LOWUP(TSTIM,THRESH,NPIX,2,NN)
114
JLO = LOWUP(TSTIM,THRESH,NPIX,1,NN)
115
JHI = LOWUP(TSTIM,THRESH,NPIX,2,NN)
121
MLO = LOWUP(TSTIM,THRESH,NPIX,1,M) !check line below
122
MHI = LOWUP(TSTIM,THRESH,NPIX,2,M) !check line above
126
IF ((MLO.EQ.1).AND.(MHI.EQ.1)) THEN
129
ELSE IF ((KLO.EQ.MLO) .AND.
134
ELSE IF (MHI.NE.MLO) THEN
135
IF ((KLO.EQ.MLO) .AND. (KHI.EQ.MHI)) THEN
141
IF ((JX.NE.M) .OR.(MHI.NE.MLO)) THEN
142
IF ((JLO.NE.MLO) .OR. (JHI.NE.MHI)) THEN
154
IF (SW.NE.0) OUTIM(NN) = FILL
159
C use second input image
162
IF (SW.NE.0) WRITE(*,12000) (N-1)
170
DO 1400, NN=OFF+1,OFF+NOPIX
172
IF ( (TSTIM(NN).GE.THRESH(1)) .AND.
173
+ (TSTIM(NN).LE.THRESH(2)) ) THEN
177
KLO = LOWUP(TSTIM,THRESH,NPIX,1,NN)
178
KHI = LOWUP(TSTIM,THRESH,NPIX,2,NN)
182
JLO = LOWUP(TSTIM,THRESH,NPIX,1,NN)
183
JHI = LOWUP(TSTIM,THRESH,NPIX,2,NN)
189
MLO = LOWUP(TSTIM,THRESH,NPIX,1,M) !check line below
190
MHI = LOWUP(TSTIM,THRESH,NPIX,2,M) !check line above
194
IF ((MLO.EQ.1).AND.(MHI.EQ.1)) THEN
197
ELSE IF ((KLO.EQ.MLO) .AND.
202
ELSE IF (MHI.NE.MLO) THEN
203
IF ((KLO.EQ.MLO) .AND. (KHI.EQ.MHI)) THEN
209
IF ((JX.NE.M) .OR.(MHI.NE.MLO)) THEN
210
IF ((JLO.NE.MLO) .OR. (JHI.NE.MHI)) THEN
222
IF (SW.NE.0) OUTIM(NN) = IN2IM(NN)
232
12000 FORMAT(' line',I5,' has problems...')
236
INTEGER FUNCTION LOWUP(A,THR,NPIX,LFLAG,PIXNO)
242
INTEGER PIXNO,NPIX(2),LFLAG
247
IF (LFLAG.EQ.1) THEN !check lower line
252
IF ((A(N).GE.THR(1)).AND.(A(N).LE.THR(2))) GOTO 1000
257
IF (N.GT.(NPIX(1)*NPIX(2))) RETURN
260
IF ((A(N).GE.THR(1)).AND.(A(N).LE.THR(2))) GOTO 1000
270
SUBROUTINE OVRLAP(STARTA,STEPA,NPIXA,STARTB,STEPB,NPIXB,
273
C++++++++++++++++++++++++++++++++++++++++++++++++++
276
C subroutine OVRLAP version 1.30 881028
277
C K. Banse ESO - Garching
283
C determine overlapping region of two "lines" in real space
289
C call as OVRLAP(STARTA,STEPA,NPIXA,STARTB,STEPB,NPIXB,BEGIN,END,STAT)
292
C STARTA: R*8 start of "line" A
293
C STEPA: R*8 stepsize of A
294
C NPIXB: I*4 no. of steps in A
295
C STARTB: R*8 start of "line" B
296
C STEPB: R*8 stepsize of B
297
C NPIXB: I*4 no. of steps in B
300
C BEGIN: R*8 begin of overlapping interval
301
C END: R*8 end of overlapping interval
302
C STAT: I*4 return status, should be = 0
304
C--------------------------------------------------
308
INTEGER NPIXA,NPIXB,STAT
310
DOUBLE PRECISION STARTA,STEPA,STARTB,STEPB
311
DOUBLE PRECISION EB,BEGIN,END
313
C compute position of last pixel
315
END = STARTA + (NPIXA-1)*STEPA
316
EB = STARTB + (NPIXB-1)*STEPB
319
IF (STEPA.LT.0.D0) THEN
320
IF (STARTA.LT.STARTB) THEN !low begin
325
IF (END.LT.EB) END = EB !high end
327
IF (END.GT.BEGIN) STAT = 1 !no overlap...!
331
IF (STARTA.LT.STARTB) THEN !high begin
336
IF (END.GT.EB) END = EB !low end
338
IF (END.LT.BEGIN) STAT = 1 !no overlap...!
344
SUBROUTINE PROGRS(INC,CINC,PRCNT,CHECK)
346
C++++++++++++++++++++++++++++++++++++++++++++++++++
349
C subroutine PROGRS version 2.00 860609
350
C K. Banse ESO - Garching
354
C time, progress of work
357
C display current time + percentage of work already done
363
C call as PROGRS(INC,CINC,PRCNT,CHECK)
366
C INC: I*4 no. of percent to increase
367
C CINC: I*4 increment for check
370
C PRCNT: I*4 percent of processing done
371
C CHECK: I*4 check value
374
C 2.10 do not write to logfile - only to terminal...
375
C 2.20 move to FORTRAN 77 + use system independent calls
377
C--------------------------------------------------
381
INTEGER INC,CINC,PRCNT,CHECK
382
INTEGER N,IAV,KLOG,NLOG,STAT
383
INTEGER UNIT(1),NULLO
385
CHARACTER TIME*40,PBUF*60
387
IF (PRCNT.GT.100) RETURN
389
C get current time, convert percentage to ASCII + display all that
393
IF (TIME(N:N).NE.' ') THEN
401
WRITE(PBUF(1:),10000) TIME(1:IAV),PRCNT
403
C set log flag to 0, so we do not write into the log file...
404
CALL STKRDI('LOG',1,1,IAV,KLOG,UNIT,NULLO,STAT)
406
CALL STKWRI('LOG',NLOG,1,1,UNIT,STAT)
407
CALL STTPUT(PBUF,STAT)
408
CALL STKWRI('LOG',KLOG,1,1,UNIT,STAT)
415
10000 FORMAT(A,I4,'% done ... ')
419
SUBROUTINE MEMDSK(IMNO,FLAG,A,NPIX,STA,WSIZE,STAT)
421
C++++++++++++++++++++++++++++++++++++++++++++++++++
424
C subroutine MEMDSK version 1.00 891129
425
C K. Banse ESO - Garching
431
C copy data stored in virtual memory to right place in disk file
434
C use STFPUT interface
437
C call as MEMDSK(IMNO,FLAG,A,NPIX,STA,WSIZE,STAT)
440
C IMNO: Integer file no.
441
C FLAG: Integer = 0, buffer A holds full frame
442
C = 1, buffer A holds data from window start on
443
C = 2, buffer A holds only the data of the window
444
C A: Real buffer with data
445
C NPIX: Integer no. of pixels in A
446
C STA: Integer start of window in total frame
447
C WSIZE: Integer no. of pixels in window
450
C STAT: Integer return status, should be = 0
452
C--------------------------------------------------
456
INTEGER IMNO,FLAG,NPIX(*),STA(*),WSIZE(*),STAT
457
INTEGER FELEM,SIZE,N,IOFF
461
FELEM = ((STA(2)-1) * NPIX(1)) + STA(1)
462
IF (FLAG .EQ. 0) THEN
463
SIZE = WSIZE(2) * NPIX(1) !WSIZE(2) lines...
464
CALL STFPUT(IMNO,FELEM,SIZE,A(FELEM),STAT)
465
ELSE IF (FLAG .EQ. 1) THEN
466
SIZE = WSIZE(2) * NPIX(1) !WSIZE(2) lines...
467
CALL STFPUT(IMNO,FELEM,SIZE,A(1),STAT)
468
ELSE IF (FLAG .EQ. 2) THEN
470
DO 1000 N=1,WSIZE(2) !again WSIZE(2) lines ...
471
CALL STFPUT(IMNO,FELEM,WSIZE(1),A(IOFF),STAT)
472
IOFF = IOFF + WSIZE(1)
473
FELEM = FELEM + NPIX(1)