SUBROUTINE PLOT(XA,YA,NTOTAL,NINCR) C ==================================== C C PURPOSE - PLOTS ARRAY OF POINTS (XA(I), YA(I)) FOR I = 1 TO NTOTAL C - CURRENT LINE TYPE AND SYMBOL TYPE ARE USED C - ALL LINES GOING TO OR COMING FROM OR PASSING THROUGH C THE PAGE ARE DRAWN TO THE BORDER C - THE NUMBER OF POINTS OFFPAGE IS RETURNED IN NOFFPG C---------------------------------------------------------------------- C SPECIFICATIONS C---------------------------------------------------------------------- IMPLICIT REAL(A-M,O-Y), LOGICAL*1(Z), INTEGER(N) INTEGER MAX0, MIN0, IFIX, MOD, IAND, MIN1, MAX1 DIMENSION ZBUF(500), Z03(2), ZBYT(4), XA(1), YA(1), 1 XXX(2), YYY(2) EQUIVALENCE (NWORD,ZBYT(1)), (ZBYT(4),ZBYTE) COMMON /HPPLOT/ NSIZE, ZBUF, OFFX, OFFY, SIZEX, SIZEY, 1 ORGX, ORGY, SCALEX, SCALEY, NMINX, NMAXX, 1 NMINY, NMAXY, NZEROX, NZEROY, NLINEN, 1 NSYMN, NPENN, ANGLEN, SLANTN, NHIGHN, NWIDEN, 1 NMAXNX, NMAXNY, N1000, INC, Z0F, Z0E, Z03, 1 ZDOWN, ZLIFT, RZEROX, RZEROY D TYPE 500, NTOTAL, NINCR D500 FORMAT ('0** PLOT: # POINTS =',I5,' INCR =',I5) RMINX=NMINX RMAXX=NMAXX RMINY=NMINY RMAXY=NMAXY NINC = MAX0 (NINCR, 1) ZMOVE=.FALSE. DO 2000 NP=1,NTOTAL,NINC ! FOR EACH POINT XX=RZEROX+XA(NP)*INC/SCALEX ! COMPUTE INTEGER COORDINATES YY=RZEROY+YA(NP)*INC/SCALEY NX=MIN1(AMAX1(XX,-32000.0),32000.0) NY=MIN1(AMAX1(YY,-32000.0),32000.0) D TYPE 501, NP, XX, YY, NX, NY D501 FORMAT (' ',I5,2X,2F10.2,2I10) NI=0 IF (NX.LT.NMINX) NLOC="1 ! COMPUTE LOCATION BITMAP IF (NX.GE.NMINX .AND. NX.LE.NMAXX) NLOC="2 IF (NX.GT.NMAXX) NLOC="4 IF (NY.LT.NMINY) NLOC=NLOC+"10 IF (NY.GE.NMINY .AND. NY.LE.NMAXY) NLOC=NLOC+"20 IF (NY.GT.NMAXY) NLOC=NLOC+"40 ZNEW=(IAND(NLOC,"22).EQ."22) IF (NLINEN.EQ.0 .OR. ZLIFT) GOTO 1600 ! INTERPOLATE ONLY IF LINES AND NOT LIFTED 1100 IF ((IAND(NLOC,"1)*IAND(NLOCN,"6).EQ.0) .AND. 1 (IAND(NLOC,"6)*IAND(NLOCN,"1).EQ.0)) GOTO 1200 RINTY = YY + (YYN-YY)/(XXN-XX) * (NMINX-XX) IF (RINTY.LT.RMINY .OR. RINTY.GT.RMAXY) GOTO 1200 NI=NI+1 XXX(NI)=RMINX YYY(NI)=RINTY 1200 IF ((IAND(NLOC,"3)*IAND(NLOCN,"4).EQ.0) .AND. 1 (IAND(NLOC,"4)*IAND(NLOCN,"3).EQ.0)) GOTO 1300 RINTY = YY + (YYN-YY)/(XXN-XX) * (NMAXX-XX) IF (RINTY.LT.RMINY .OR. RINTY.GT.RMAXY) GOTO 1300 NI=NI+1 XXX(NI)=RMAXX YYY(NI)=RINTY 1300 IF ((IAND(NLOC,"10)*IAND(NLOCN,"60).EQ.0) .AND. 1 (IAND(NLOC,"60)*IAND(NLOCN,"10).EQ.0)) GOTO 1400 RINTX = XX + (XXN-XX)/(YYN-YY) * (RMINY-YY) IF (RINTX.LT.RMINX .OR. RINTX.GT.RMAXX) GOTO 1400 NI=NI+1 XXX(NI)=RINTX YYY(NI)=RMINY 1400 IF ((IAND(NLOC,"30)*IAND(NLOCN,"40).EQ.0) .AND. 1 (IAND(NLOC,"40)*IAND(NLOCN,"30).EQ.0)) GOTO 1500 RINTX = XX + (XXN-XX)/(YYN-YY) * (RMAXY-YY) IF (RINTX.LT.RMINX .OR. RINTX.GT.RMAXX) GOTO 1500 NI=NI+1 XXX(NI)=RINTX YYY(NI)=RMAXY 1500 IF (NI.LE.0) GOTO 1600 IF (NSYMN.GT.0) CALL ASC('~#}@') IF (.NOT.ZDOWN) CALL ASC('p@') IF (ZDOWN) CALL ASC('q@') ZMOVE=.TRUE. ZDOWN=.TRUE. DO 1501 NJ=1,NI 1501 CALL MBP(IFIX(XXX(NJ)),IFIX(YYY(NJ))) IF (NSYMN.LE.0) GOTO 1600 CALL ASC('~#@') CALL SBN(NSYMN) ZMOVE=.FALSE. 1600 IF (ZMOVE) GOTO 1601 IF (.NOT.ZLIFT .AND. ZDOWN) CALL ASC('q@') IF (.NOT.ZDOWN .OR. ZLIFT) CALL ASC('p@') ZMOVE=.TRUE. 1601 IF (ZNEW) CALL MBP(NX,NY) NLOCN=NLOC XXN=XX YYN=YY ZDOWN=ZNEW ZLIFT=.FALSE. IF (NSIZE.GT.450) CALL HPSEND 2000 CONTINUE CALL HPSEND RETURN END