Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0123/oplot.for
There are 2 other files named oplot.for in the archive. Click here to see a list.
00100 C PLOTTER SEQUENCER
00200 C
00300 C THE PACKAGE CONSISTS OF THE SUBROUTINES OPLOT,DELETE,OLINE AND OPOINT.
00400 C A SAMPLE PROGRAM IS ALSO GIVEN.
00500 C
00600 C OPLOT(XX,YY,IPEN)
00700 C THIS PROGRAM MOVES THE PEN FROM ITS CURRENT POSITION TO THE POINT
00800 C (XX,YY). THE CONTROL (IPEN) OF THE PEN IS
00900 C 3, RISE THE PEN
01000 C 2, LOVER THE PEN
01100 C 1, POSITION UNCHANGED.
01200 C THE POSITION OF THE PEN IS CONTROLLED BEFORE THE MOVEMENT. THE
01300 C VERY LAST CALL OF OPLOT MUST CONTAIN A IPEN VALUE LESS THAN 0.
01400 C THE ACTUAL PLOTTING IS MADE IN THE ORDER CONTROLLED BY THE
01500 C PROGRAM DELETE. FOR ADDITIONAL INFORMATION SEE: KUOKKANEN, LEIPALA,
01600 C NEVALAINEN: IMPLEMENTATION AND ANALYSIS OF A PLOTTING SEQUENCER,
01700 C INST. OF COMP. SCI, UNIV. OF TURKU, FINLAND.
01800 C INTERNAL VARIABLES:
01900 C (X,Y) AN INTERNAL AREA FOR STORING THE POINTS OF THE CURVES,
02000 C LSG THE LENGTH OF THE CURVE SEGMENTS IN THE AREA (X,Y),
02100 C N THE NUMBER OF CURVE SEGMENTS IN THE AREA (X,Y),
02200 C NS THE NUMBER OF RESERVED CURVE SEGMENTS,
02300 C IS THE INDEX OF THE CURRENT CURVE SEGMENT,
02400 C (IREAR,IFRONT) VECTORS GIVING THE LAST AND FIRST USED ELEMENTS
02500 C IN THE CURVE SEGMENTS. AN EMPTY CURVE SEGMENT IS RECOGNISED
02600 C FROM THE CONDITION IREAR(J)=IFRONT(J)-1.
02700 C IFIRST 0, WHEN CALLING THE SUBROUTINE FOR THE FIRST TIME
02800 C 1, OTHERWISE.
02900 C KON 1,WHEN THE PEN IS IN THE UPPER POSITION.
03000 C IC THE ABSOLUTE VALUE OF IPEN.
03100 C (XN,YN) THE CURRENT COORDINATES OF THE PHYSICAL PEN OF THE PLOTTER.
03200 C (XE,YE) THE CURRENT COORDINATES, WHEN MOVING THE PEN IN THE UPPER
03300 C POSITION.
03400 C (XI,YI) THE LAST POINT OF THE CURVE SEGMENT THAT MUST BE CONTINUED
03500 C TO ANOTHER SEGMENT.
03600 C NRSEG THE NUMBER OF RESERVED SEGMENTS AT THE TIME OF THE LAST CALL.
03700 C LN THE DEGREE OF THE HEURISTICS WHEN CHOOSING THE NEXT
03800 C SEGMENT AT THE TIME OF LAST CALL.
03900 C WASTE THE TOTAL LENGTH OF THE WASTE MOVEMENTS.
04000 SUBROUTINE OPLOT (XX,YY,IPEN)
04100 DIMENSION X(1001),Y(1001),IFRONT(50),IREAR(50)
04200 DATA LSG,N/20,50/
04300 DATA IFRST/0/
04400 IF(IFRST) 20,10,20
04500
04600 C INITIALIZATION
04700 10 WASTE=0.
04800 XN=0.
04900 YN=0.
05000 NS=0
05100 KON=1
05200 DO 15 I=1,N
05300 IFRONT(I)=(I-1)*LSG+2
05400 IREAR(I) = (I-1)*LSG+1
05500 15 CONTINUE
05600 IFRST=1
05700 XE=0.
05800 YE=0.
05900
06000 C TEST THE POSITION OF THE PEN
06100 20 IC=IABS(IPEN)
06200 25 IF(IC-2) 60,35,30
06300
06400 C THE PEN IS LIFTED UP,IC=3
06500 30 IF(KON.GT.0) GO TO 31
06600 NS=NS+1
06700 KON=1
06800 31 XE=XX
06900 YE=YY
07000 GO TO 100
07100
07200 C THE PEN IS SET DOWN,IC=2
07300 35 IF (KON.EQ.0) GO TO 61
07400 KON=0
07500 X1=XE
07600 Y1=YE
07700 IF(NS.GE.N) GO TO 63
07800 IS=NS+1
07900 GO TO 64
08000
08100 C THE PEN IS NEITHER LIFTED UP NOR SET DOWN
08200 C IS IT IN THE UPPER POSITION
08300 60 IF(KON) 130,61,130
08400 130 XE=XX
08500 YE=YY
08600 GO TO 100
08700
08800 C STORE THE NEXT POINT
08900 C IS THE SEGMENT FULL
09000 61 LFREE=IREAR(IS)-IFRONT(IS)+1
09100 IF(LFREE-LSG) 65,62,62
09200 62 L=IREAR(IS)
09300 X1=X(L)
09400 Y1=Y(L)
09500 NS=NS+1
09600 IS=NS+1
09700 IF(NS.LT.N) GO TO 64
09800 C ALL SEGMENTS ARE RESERVED,
09900 C DEALLOCATE ONE OF THE SEGMENTS
10000 63 CALL DELETE (X,Y,IFRONT,IREAR,XN,YN,IS,N,WASTE)
10100 64 L=IREAR(IS)+1
10200 IREAR(IS)=L
10300 X(L)=X1
10400 Y(L)=Y1
10500 C STORE THE POINT OF THE CALL
10600 65 L=IREAR(IS)+1
10700 IREAR(IS)=L
10800 X(L)=XX
10900 Y(L)=YY
11000
11100 C RETURN
11200 100 IF(IPEN.GT.0) RETURN
11300
11400 C THE LAST CALL
11500 IF (KON.EQ.0) NS=NS+1
11600 NRSEG=N
11700 IFRST=0
11800 IF(NS.LT.N) NRSEG=NS
11900
12000 C DEALLOCATE ONE SEGMENT
12100 LN=NRSEG
12200 160 IF(NRSEG) 150,150,120
12300 120 CALL DELETE(X,Y,IFRONT,IREAR,XN,YN,IS,LN,WASTE)
12400 L=IFRONT(IS)
12500 X(L)=9999.
12600 Y(L)=9999.
12700 IREAR(IS)=L
12800 NRSEG=NRSEG-1
12900 GO TO 160
13000 150 CALL PLOT(XX,YY,-3)
13100 RETURN
13200 END
13300
13400
13500
13600 C DELETE (X,Y,IFRONT,IREAR,XN,YN,IS,N,WASTE)
13700 C THE SELECTION OF THE NEXT CURVE AND ITS PLOTTING. THIS RPOGRAM IS
13800 C USED ONLY BY OPLOT.
13900 C INTERNAL VARIABLES:
14000 C DN THE MINIMUM DISTANCE TO THE NEXT CURVE SEGMENT.
14100 C D,G THE DISTANCES TO A CERTAIN CURVE SEGMENT.
14200 C IDIR THE DIRECTION OF THE CURVE DRAWING:
14300 C =1, IF THE DIRECTION IS FROM THE FIRST TO THE LAST COORDINATE,
14400 C =-1, FOR THE OPPOSITE.
14500 C L THE INDEX OF THE LAST POINT.
14600 C IA THE INDEX OF THE CURRENT POINT.
14700 SUBROUTINE DELETE(X,Y,IFRONT,IREAR,XN,YN,IS,N,WASTE)
14800 DIMENSION X(1),Y(1),IFRONT(1),IREAR(1)
14900 DN=9999999999.
15000 DO 45 J=1,N
15100
15200 C DETERMINE THE DISTANCE AND TEST, IF MINIMUM
15300 D= ABS(XN-X(IFRONT(J)))
15400 G= ABS(YN-Y(IFRONT(J)))
15500 IF (G.GT.D) D=G
15600 IF (D.GE.DN) GO TO 42
15700 DN = D
15800 IS=J
15900 IDIR=1
16000 42 D= ABS(XN-X(IREAR(J)))
16100 G= ABS(YN-Y(IREAR(J)))
16200 IF (G.GT.D) D=G
16300 IF(D.GE.DN) GO TO 45
16400 DN=D
16500 IS=J
16600 IDIR=-1
16700 45 CONTINUE
16800
16900 C PLOTTING OF THE SEGMENT
17000 C CHOOSE THE DIRECTION
17100 IF(IDIR) 81,82,82
17200 81 L=IFRONT(IS)
17300 IA=IREAR(IS)
17400 XN=X(L)
17500 YN=Y(L)
17600 GO TO 85
17700 82 L=IREAR(IS)
17800 IA=IFRONT(IS)
17900 XN=X(L)
18000 YN=Y(L)
18100 85 CALL PLOT(X(IA),Y(IA),3)
18200 CALL PLOT(X(IA),Y(IA),2)
18300
18400 C LOOP
18500 I=2
18600 86 IF(I.GT.(IREAR(IS)-IFRONT(IS)+1)) GO TO 87
18700 I=I+1
18800 IA=IA+IDIR
18900 CALL PLOT (X(IA),Y(IA),1)
19000 GO TO 86
19100
19200 C MARK THE SEGMENT FREE
19300 87 IREAR(IS)=IFRONT(IS)-1
19400 CALL PLOT(XN,YN,3)
19500 WASTE=WASTE+DN
19600 RETURN
19700 END