SUBROUTINE VISBO (X1,T1,B1,M,X0,T0,B0,N0,X,Y,N,I,PL) C [BOUNDS] C X(N) ARRAY OF ARGUMENTS C Y(N) ARRAY OF FUNCTION VALUES C I DIRECTION OF PEN MOVEMENT C PL PEN MOVEMENT SUBROUTINE C [29-MAY-74] LOGICAL*1 L,PO,EQ,VV,VISSL DIMENSION U(2) VIRTUAL X(1),Y(1) VIRTUAL X0(1),T0(1),B0(1),X1(1),T1(1),B1(1) EQUIVALENCE (U1,U(1)),(U2,U(2)) DATA EP/1.0E-4/ II(J)=MAX0(MIN0(J+I,M),1) PO(X)=X.GT.EP EQ(X,Y)=ABS(X-Y).LE.(0.5E-4) C === INITIALIZATION IF (N.LE.1) RETURN J=(N+1-I*(N-1))/2 J1=((M+1)*(1-I))/2 XXXX=X(J) YYYY=Y(J) !FOR VIRTUAL CONVERSIONS CALL PL (XXXX,YYYY,.FALSE.) IF (N0.LE.1) GO TO 61 S=FLOAT(I) ET= 1.0 EB=-1.0 L=.TRUE. K=(1-I)/2 J0=(N0+1-I*(N0-1))/2 Z=X(J) Z0=X0(J0) IF (EQ(Z,Z0)) GO TO 32 IF (S*(Z-Z0)) 10,32,20 C --- IF THE FUNCTION IS DEFINED WHILE BOUNDS ARE NOT, THE FUNCTION C --- IS VISIBLE AND MUST BE COPIED, ESTABLISHING NEW BOUNDS. 10 J1=II(J1) XXXX=X(J) YYYY=Y(J) CALL PL (XXXX,YYYY,.TRUE.) X1(J1)=X(J) T1(J1)=Y(J) B1(J1)=Y(J) J=J+I IF (EQ(X(J),Z0)) GO TO 30 IF (S*(X(J)-Z0)) 10,30,30 C --- IF BOUNDS, BUT NOT THE FUNCTION, ARE DEFINED, THEY PERSIST. 20 J1=II(J1) X1(J1)=X0(J0) T1(J1)=T0(J0) B1(J1)=B0(J0) J0=J0+I IF (EQ(Z,X0(J0))) GO TO 30 IF (S*(Z-X0(J0))) 30,30,20 C === MAIN LOOP C --- AT A POINT WHERE EITHER THE FUNCTION OR THE BOUNDS ARE C --- DEFINED, IT MAY BE NECESSARY TO OBTAIN THE OTHER BY LINEAR C --- INTERPOLATION, UNLESS THEIR POINTS OF DEFINITION COINCIDE. 30 IF ((J.LT.1).OR.(J.GT.N)) GO TO 50 IF ((J0.LT.1).OR.(J0.GT.N0)) GO TO 60 Z=X(J) Z0=X0(J0) 32 EX=S*AMIN1(S*Z,S*Z0) WY=VISLI(EX,X,Y,MAX0(MIN0(J+K,N),2)) TO=VISLI(EX,X0,T0,MAX0(MIN0(J0+K,N0),2)) BO=VISLI(EX,X0,B0,MAX0(MIN0(J0+K,N0),2)) IF (EQ(EX,Z0)) J0=J0+I IF (EQ(EX,Z)) J=J+I C --- POSSIBLE INTERSECTIONS BETWEEN THE FUNCTION AND THE BOUNDS C --- MUST BE RECORDED SO AS TO DESCRIBE THE NEW BOUNDS ACCURATELY. C --- CARE IS NECESSARY TO AVOID TRIVIAL INTERSECTIONS, OR THOSE C --- WHICH OCCUR AT ENDPOINTS. TE=AMAX1(WY,TO) BE=AMIN1(WY,BO) DT=WY-TO DB=WY-BO VT=ET+DT VB=EB+DB IF (L) GO TO 46 JJ=0 IF (SIGN(1.0,DT).EQ.SIGN(1.0,ET)) GO TO 41 VT=DT-ET JJ=JJ+1 U(JJ)=XX-ET*((EX-XX)/(DT-ET)) 41 IF (SIGN(1.0,DB).EQ.SIGN(1.0,EB)) GO TO 42 VB=DB-EB JJ=JJ+1 U(JJ)=XX-EB*((EX-XX)/(DB-EB)) 42 IF (JJ.EQ.0) GO TO 44 DO 43 KK=1,JJ IF ((KK.EQ.1).AND.(JJ.EQ.1)) XI=U1 IF ((KK.EQ.1).AND.(JJ.EQ.2)) XI=S*AMIN1(S*U1,S*U2) IF (KK.EQ.2) XI=S*AMAX1(S*U1,S*U2) F=(XI-XX)/(EX-XX) YI=YY+F*(WY-YY) CALL PL (XI,YI,((KK.EQ.1).AND.VV)) IF (EQ(XX,XI).OR.EQ(XI,EX)) GO TO 43 IF ((KK.EQ.2).AND.EQ(U1,U2)) GO TO 43 J1=II(J1) X1(J1)=XI T1(J1)=TT+F*(TO-TT) B1(J1)=BB+F*(BO-BB) 43 CONTINUE 44 IF ((J1.LT.2).OR.(J1.GT.M-1)) GO TO 46 IF (.NOT.VISSL(EX,TE,X1,T1,J1+K)) GO TO 46 IF ( VISSL(EX,BE,X1,B1,J1+K)) GO TO 48 46 J1=II(J1) 48 X1(J1)=EX T1(J1)=TE B1(J1)=BE VV=PO(VT).OR.PO(-VB) CALL PL (EX,WY,VV) L=.FALSE. ET=DT EB=DB XX=EX YY=WY TT=TO BB=BO GO TO 30 C === TERMINATION C --- IF THE FUNCTION IS EXHAUSTED BEFORE THE BOUNDS, COPY THEM. 50 IF ((J0.LT.1).OR.(J0.GT.N0)) GO TO 70 J1=II(J1) X1(J1)=X0(J0) T1(J1)=T0(J0) B1(J1)=B0(J0) J0=J0+I GO TO 50 C --- IF THE BOUNDS ARE EXHAUSTED BEFORE THE FUNCTION, COPY THE C REMAINING PART OF THE FUNCTION, WHICH WILL BE VISIBLE. 60 CALL PL (EX,WY,.FALSE.) 61 IF ((J.LT.1).OR.(J.GT.N)) GO TO 70 XXXX=X(J) YYYY=Y(J) CALL PL (XXXX,YYYY,.TRUE.) J1=II(J1) X1(J1)=X(J) T1(J1)=Y(J) B1(J1)=Y(J) J=J+I GO TO 61 C --- COPY THE NEW BOUNDS OVER THE OLD ONES, SHIFTING THEM AS NECESSARY. 70 N0=((M+1)*(1-I))/2+I*J1 J1=(J1+1-I*(J1-1))/2 DO 71 J0=1,N0 X0(J0)=X1(J1) T0(J0)=T1(J1) B0(J0)=B1(J1) 71 J1=J1+1 RETURN END