SUBROUTINE PLOT(X,Y,IP) C C THIS ROUTINE IS THE HEART OF THE PLOTTING SYSTEM C C THE CALL IS: C C CALL PLOT(XP,YP,IPEN) C C WHERE XP IS THE VIRTUAL X COORDANATE OF THE END POINT OF THE DESIRED C LINE, C WHERE YP IS THE VIRTUAL Y COORDANATE OF THE END POINT OF THE DESIRED C LINE, C AND IPEN IS THE PEN CONTROL PARAMETER. C C IF THE ABSOLUTE VALUE OF IPEN IS 2, THE MOVE IS MADE WITH THE PEN DOWN, C IF THE ABSOLUTE VALUE OF IPEN IS 3, THE MOVE IS MADE WITH THE PEN UP. C IF THE ABSOLUTE VALUE OF IPEN IS ANYTHING ELSE, NO CHANGE IN THE PEN IS C MADE. C IF THE SIGN OF IPEN IS -, THE END POINT OF THE LINE DRAWN IS ASSIGNED TO C BE THE ORIGIN, (0,0). C IF THE SIGN OF IPEN IS +, THE ENDPOINT OF THE LINE WILL BE (XP,YP). C C PLOT SHOULD BE CALLED ONCE TO INITIALIZE IT. C THE CALL 'CALL PLOT(0,0,3)' WOULD SUFFICE. C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR C C SCALE IS THE SCALE EXPRESSED IN RASTER UNITS PER VIRTUAL UNIT. C IDEV IS A DEVICE SELECTION FLAG. C IPEN IS THE CURRENT IPEN PARAMETER C XCUR IS THE CURRENT VIRTUAL X COORDANATE IN RASTER UNITS. C YCUR IS THE CURRENT VIRYUAL Y COORDANATE IN RASTER UNITS. C DATA XCUR,YCUR/0.,0./ DATA IDEV,SCALE/1,200./ C C DEFAULT VALUES ARE SCALE=1, ANGLE=0, PEN AT (0,0). C XT=IFIX(X*SCALE) YT=IFIX(Y*SCALE) C C CALCULATIONS ARE DONE IN RASTER UNITS TO AVOID ROUND OFF ERROR C CALL DELTAP(XT-XCUR,YT-YCUR,IABS(IP)) IF(IP)23,25,25 25 XCUR=XT YCUR=YT C C IPEN POSATIVE MEANS END POINT AS SPECIFIED PLUS/MINUS ONE RASTER UNIT C RETURN 23 XCUR=0. YCUR=0. C C IPEN NEGATIVE MEANS END POINT IS NEW ORIGIN C RETURN END SUBROUTINE SYMBOL(X,Y,HGT,BCD,ANGD,N) C C THIS IS THE SYMBOL DRAWING SUBROUTINE. C C X AND Y SPECIFY THE POSITION AT WHICH THE SYMBOL IS TO BE DRAWN. C HGT IS THE HIGHT OF THE CHARACTERS IN VIRTUAL UNITS C BCD CONTAINS THE CHARACTERS (S) TO BE PLOTTED C ANGD IS THE ORIENTAION IN DEGREES RELATIVE TO THE X AXIS C N IS A CONTROL PARAMETER. C C THE CHARACTER AND ITS SPACE FORMS A SQUARE OF WIDTH HGT. C C IF N > 0, N CHARACTERS IN H FORMAT ARE PLOTTED. C IF N = 0, ONE CHARACTER IS PLOTTED WHOSE CODE IS BCD. C C IF N >0, OR =0 , X AND Y ARE THE LOWER LEFT POINT OF THE CHARACTER. C C IF N < 0, ONE CHARACTER WHOS CODE IS B IS PLOTTED CENTERED AROUND (X,Y C ). C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG,ANG DATA ANG,SINA,COSA/0.,0.,1./ CALL PLOT(X,Y,3) C C FIRST GO TO THE SPECIFIED POINT C IF(ANG-ANGD)10,20,10 C C IF THE REQUESTED ANGLE IS THE SAME AS THE CURRENT ONE, C AVOID CALCULATING THE SIN AND COSINE C 10 ANG=ANGD SINA=SIND(ANG) COSA=COSD(ANG) 20 SEG=HGT/6. C C CHARACTERS ARE ON A 6X6 GRID C IF(N) 60,50,30 30 DO 40 J=1,N C C THIS LOOP PLOTS THE N CHARACTERS IN BCD. C CALL CGET(BCD,J,CHAR) 40 CALL CPLOT(CHAR) RETURN 50 CALL CPLOT(BCD) C C THIS PLOTS ONE CHARACTER WHOS CODE IS BCD C RETURN 60 CALL CPLOT(-BCD) C C THIS PRODUCES A CENTERED CHARACTER. C RETURN END SUBROUTINE CPLOT(CHAR) C C THIS ROUTINE DRIVES THE CHARACTER GENERATOR. C THE ANGLE AND HIGHT HAVE ALREADY BE COMPUTED. C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG IF(CHAR)50,5,5 C C CHECK FOR CENTERED OR NORMAL CHARACTER C 5 CALL WHERE(XLL,YLL) C C SET THE LOWER LEFT OF THE CHARACTER AT CURRENT POSITION. C CALL SELCQ(CHAR) C C SET UP FOR REQUESTED CHARACTER. C 10 CALL CQXY(X,Y,IPEN) C C CALL FOR A VECTOR C X=X*SEG Y=(Y-1.)*SEG XP=XLL+X*COSA-Y*SINA YP=YLL+X*SINA+Y*COSA IF(IPEN-7)25,20,20 C C CHECK FOR LAST VECTOR C 25 CALL PLOT(XP,YP,IPEN) C C PLOT RELATIVE TO XLL,YLL AND GO BACK FOR MORE C GOTO 10 20 IF(CHAR)30,40,40 C C CENTERED CHARACTERS GET FUDGED, SO CHECK FOR THAT C 40 CALL PLOT(XP,YP,IPEN) RETURN 30 CALL PLOT(X0,Y0,IPEN) C C PLOT TO CENTER OF CHARACTER C RETURN 50 CALL WHERE(X0,Y0) C C FIND OUT WHERE CENTER OF CHARACTER SHOULD BE (IS) C XLL=X0-2.*SEG YLL=Y0-3.*SEG CALL PLOT(XLL,YLL,3) C C CALCULATE THE LOWER LEFT FROM GIVEN CENTER, THEN GO THERE. C CALL SELCQ(-CHAR) GOTO 10 C C SELECT CENTERED CHARACTER, THEN PROCESS NORMALLY C END SUBROUTINE ASSIGN(X,Y) C C THIS ROUTINE ASSIGNS THE CURRENT PEN POSITION AS VIRTUAL (X,Y). C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG XCUR=IFIX(X*SCALE) YCUR=IFIX(Y*SCALE) C C XCUR AND YCUR ARE STORED IN RASTER TS C RETURN END SUBROUTINE WHERE(X,Y) C C THIS ROUTINE RETURNS THE VIRTUAL COORDANADTES OF THE CURRENT C PEN POSITION C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG X=XCUR/SCALE Y=YCUR/SCALE C C XCUR AND YCUR ARE IN RASTER UNITS C RETURN END SUBROUTINE FACTOR(FACT) C C THIS ROUTINE ESTABLISHES A NEW SCALE FACTOR C FACT=1 IS 1 UNIT = 1 INCH C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG,ANG SCALE=FACT*200. C C MY PLOTTER HAS 200 STEPS PER INCH C RETURN END SUBROUTINE NUMBER (XP, YP, HGT, FPN, THETA, ND) C C THIS ROUTINE CONVERTS A NUMBER INTO PLOTTED FORM C C XP AND YP ARE THE COORDANATES WHERE THE PLOTTED NUMBER SHOULD BEGIN C HGT IS THE HIGHT IF THE CHARACTERS. C FPN IS THE NUMBER (FLOATING OR FIXED IN PDP) TO BE CONVERTED C THETA IS THE ANGLE THE CHARACTERS MAKE WITH THE X AXIS C C IF ND>0, IT SPECIFIES THE NUMBER OF DIGITS TO THE RIGHT OF THE DECIMAL C POINT THAT ARE TO BE CONVERTED AND PLOTTED, AFTER PROPER ROUNDING. C FOR EXAMBLE, ASSUME AN INTERNAL VALUE OF -0.1234567X10^3. IF C ND WERE 2, THE PLOTTED NUMBER WOULD BE '-123.46' . C C IF ND=0, ONLY THE INTEGER PORTION AND A DECIMAL POINT C ARE PLOTTED, AFTER ROUNDING. C C IF ND=-1, ONLY THE NUMBERS INTEGER PORTION IS PLOTTED, AFTER C ROUNDING. (THE NUMBER ABOVE WOULD BE PLOTTED AS '-123' W/O DECIMAL POINT C C IF ND<-1, ABS(ND)-1 DIGITS ARE TRUNCATED FROM THE INTEGER PORTION, C AFTER ROUNDING.. C COMMON/PLOTC/SCALE,IDEV,IPEN,XCUR,YCUR,SINA,COSA,SEG,ANG DATA MAXN/9/ DATA SINA,COSA,ANG/0.,1.,0./ C MOVE TO REQURSTED LOCATION CALL PLOT(XP,YP,3) C IF THE ANGLE IS THE SAME, SAVE THE SIN-COSIN WORK IF(THETA-ANG) 5, 6, 5 5 ANG=THETA SINA=SIND(ANG) COSA=COSD(ANG) 6 SEG=HGT/6. FPV = FPN N = ND C SET N VALUE TO + OR - MAXN, IF OUT OF RANGE IF (N - MAXN) 11, 11, 10 10 N = MAXN 11 IF (N + MAXN) 12, 20, 20 12 N = -MAXN C INSERT MINUS SIGN IN FRONT OF NUMBER, IF NEGATIVE 20 IF (FPV) 21, 30, 30 21 CALL CPLOT(45) C WHEN SYMBOL IS CALLED WITH SAMEV FOR X AND Y, THE CHARACTER STRING C CONTINUES FROM THE LAST CHARACTER PLOTTED BY SYMBOL C MN LOCATES EXPONENT VALUE FOR PROPER ROUNDING OF NUMBER 30 MN = -N C IF SCALING IS DONE, MN MUST BE ADJUSTED IF (N) 31, 32, 32 31 MN = MN - 1 C ROUND INPUT NUMBER AND SET TO POSITIVE VALUE 32 FPV = ABS(FPV) + (0.5 * 10. ** MN) C DETERMINE CHARACTERISTIC OF FPV AND INCREMENT IT BY 1 I = ALOG10(FPV) + 1.0 ILP = I C IF SCALING IS DONE, ILP MUST BE REDUCED ACCORDING TO SCALING IF (N + 1) 40, 41, 41 40 ILP = ILP + N + 1 C IF NUMBER IS LESS THAN 1 PLOT A ZERO BEFORE DECIMAL (IF ANY) 41 IF (ILP) 50, 50, 51 50 CALL CPLOT(48) GO TO 61 C ILP IS NUMBER OF DIGITS TO LEFT OF DECIMAL POINT 51 DO 60 J = 1, ILP C LOCATE SINGLE LEFTMOST DIGIT OF NUMBER K = FPV * 10. ** (J - I) CALL CPLOT(K+48) C SUBTRACT VALUE OF PREVIOUS DIGIT FROM NUMBER TO LOCATE NEXT DIGIT 60 FPV = FPV - (FLOAT(K) * 10. ** (I - J)) C NO DECIMAL POINT IS PLOTTED IF N IS NEGATIVE, EXIT FROM ROUTINE 61 IF (N) 99, 70, 70 70 CALL CPLOT(46) C PLOT DIGITS TO RIGHT OF DECIMAL IF N GT 0, OTHERWISE EXIT IF (N) 99, 99, 80 80 DO 90 J = 1, N C SCALE FRACTIONAL REMAINDER TO GIVE INTEGER DIGIT K = FPV * 10. CALL CPLOT(K+48) C SUBTRACT INTEGER VALUE TO LOCATE NEXT DIGIT 90 FPV = FPV * 10. - FLOAT(K) 99 RETURN END SUBROUTINE AXIS(XPAGE,YPAGE,IBCD,NCHAR,AXLEN,ANGLE,FIRSTV,DELTAV) C..... XPAGE,YPAGE COORDINATES OF STARTING POINT OF AXIS, IN INCHES C..... IBCD AXIS TITLE. C..... NCHAR NUMBER OF CHARACTERS IN TITLE. + FOR C.C-W SIDE. C..... AXLEN FLOATING POINT AXIS LENGTH IN INCHES. C..... ANGLE ANGLE OF AXIS FROM THE X-DIRECTION, IN DEGREES. C..... FIRSTV SCALE VALUE AT THE FIRST TIC MARK. C..... DELTAV CHANGE IN SCALE BETWEEN TIC MARKS ONE INCH APART DIMENSION IBCD(2) KN=NCHAR A=1.0 IF (KN) 1,2,2 1 A=-A KN=-KN 2 EX=0.0 ADX= ABS (DELTAV) IF (ADX) 3,7,3 3 IF (ADX- 99.0) 6,4,4 4 ADX=ADX/10.0 EX=EX+1.0 GO TO 3 5 ADX=ADX*10.0 EX=EX-1.0 6 IF (ADX-0.01) 5,7,7 7 XVAL=FIRSTV*10.0**(-EX) ADX= DELTAV*10.0**(-EX) STH=ANGLE*0.0174533 CTH=COS(STH STH=SIN(STH) DXB=-0.1 DYB=0.15*A-0.05 XN=XPAGE+DXB*CTH-DYB*STH YN=YPAGE+DYB*CTH+DXB*STH NTIC=AXLEN+1.0 NT=NTIC/2 DO 20 I=1,NTIC CALL NUMBER(XN,YN,0.105,XVAL,ANGLE,2) XVAL=XVAL+ADX XN=XN+CTH YN=YN+STH IF (NT) 20,11,20 11 Z=KN IF (EX) 12,13,12 12 Z=Z+7.0 13 DXB=-.07*Z+AXLEN*0.5 DYB=0.325*A-0.075 XT=XPAGE+DXB*CTH-DYB*STH YT=YPAGE+DYB*CTH+DXB*STH CALL SYMBOL(XT,YT,0.14,IBCD(1),ANGLE,KN) IF (EX) 14,20,14 14 Z=KN+2 XT=XT+Z*CTH*0.14 YT=YT+Z*STH*0.14 CALL SYMBOL(XT,YT,0.14,3H*10,ANGLE,3) XT=XT+(3.0*CTH-0.8*STH)*0.14 YT=YT+(3.0*STH+0.8*CTH)*0.14 CALL NUMBER(XT,YT,0.07,EX,ANGLE,-1) 20 NT=NT-1 CALL PLOT(XPAGE+AXLEN*CTH,YPAGE+AXLEN*STH,3) DXB=-0.07*A*STH DYB=+0.07*A*CTH A=NTIC-1 XN=XPAGE+A*CTH YN=YPAGE+A*STH DO 30 I=1,NTIC CALL PLOT(XN,YN,2) CALL PLOT(XN+DXB,YN+DYB,2) CALL PLOT(XN,YN,2) XN=XN-CTH YN=YN-STH 30 CONTINUE RETURN END C C THIS ROUTINE PRODUCES A SYMBOL TABLE, WHICH SHOWS THE CHARACTERS C AVAILABLE IN THE SYMBOL ROUTINE. C C MAXCHR IS THE INTEGER EQUIVALENT OF THE LAST CHARACTER. MAXCHR=63 CALL PLOT(0,0,3) CALL PLOT (0.0,11.0,2) CALL PLOT (8.5,11.0,2) CALL PLOT (8.5,0.0,2) CALL PLOT (0.0,0.0,2) CALL SYMBOL(0.75,10.4,.14,49HCHARACTERS AVAILABLE IN SYMBOL ROUTIN 1E ( PDP 8E ),0.,49) CALL PLOT(8.25,10.,3) CALL PLOT(0.25,10.,2) CALL PLOT(0.25,0.25,2) CALL PLOT(8.25,0.25,2) CALL PLOT(8.25,10.0,2) X=0.5 K=0 DO 200 I=1,5 Y=9.4 DO 100 J=1,13 CALL NUMBER(X,Y+0.1,.14,FLOAT (K),0.0,-1) 4 CALL SYMBOL(X+0.45,Y,0.35,K,0.0,0) 10 IO1=K/8 IO2=K-IO1*8 CALL NUMBER(X+0.90,Y+0.1,0.14,FLOAT (IO1),0.0,-1) CALL NUMBER(X+1.04,Y+0.1,0.14,FLOAT (IO2),0.0,-1) GO TO 20 15 CALL SYMBOL(X+1.0,Y+0.1,.14,1H-,0.0,1) 20 K=K+1 Y=Y-.7307 IF(K-MAXCHR) 100,100,300 100 CONTINUE CALL PLOT(X+1.35,0.25,3) CALL PLOT(X+1.35,10.,2) 200 X=X+1.6 300 CALL WAIT END `x