SUBROUTINE SYMBOS (X, Y, HEIGHT, ISYM1) C C PLOTS A SPECIAL SYMBOL AT LOCATION (X,Y) IN INCHES. C HEIGHT IS THE HEIGHT IN INCHES OF THE SYMBOL. C ISYM1 IS THE CODE FOR THE SYMBOL, FROM 65 TO 72. C FOR ISYM1= 97 TO 101 SOLID SYMBOLS ARE OPTIONALLY AVAILABLE. C NOTE THAT THESE CODES CORRESPOND TO THE ASCII CHARACTERS A-H C AND a-e. C DEFINE THE SYMBOL IF THE FULL SET IS DESIRED, C IN WHICH CASE THE CIRCLE IS ALSO MORE CAREFULLY DRAWN. C IF IS NOT DEFINED, THE SOLID SYMBOLS ARE DRAWN WITH C THE OPEN SYMBOLS. C C ISYM1(dec) (ascii) Symbol ISYM1(dec) (ascii) Symbol C --------- ------- ------ ---------- ------- ------------ C 65 or -65 A square 97 or -97 a solid square C 66 or -66 B delta 98 or -98 b solid delta C 67 or -67 C circle 99 or -99 c solid circle C 68 or -68 D diamond 100 or -100 d solid diamond C 69 or -69 E del 101 or -101 e solid del C 70 or -70 F plus C 71 or -71 G times C 72 or -72 H star C C OPEN SYMBOLS: C C PENSTROKES FOR THE SYMBOLS MUST GO THRU THE POINTS DEFINED BY C XPTS,YPTS. VERTEX IS AN ARRAY OF INDICES INTO XPTS,YPTS, C WHICH DEFINES THE PENSTROKES FOR EACH SYMBOL. START IS A C LIST OF INDICES INTO VERTEX DEFINING THE START OF EACH C SYMBOL, WITH ONE EXTRA AT THE END. C C THE VERTICES ARE NUMBERED IN XPTS,YPTS AS FOLLOWS: C C 16 17 2 3 4 C 15 5 C 14 1 6 C 13 7 C 12 11 10 9 8 C C SOLID SYMBOLS: C C THE EQUATIONS FOR THE UPPER AND LOWER LIMITS OF EACH SYMBOLS C ARE WRITTEN IN THE FORM Y = AX + B, ON AN UNSCALED SYMBOL SIZE C OF +- 0.5 UNITS. MORE THAN ONE LIMIT IS PERMITTED, THE INNERMOST C ONE ON ANY INTERVAL IS USED. THE PARAMETERS ARE STORED IN ARRAYS C AND FOR EACH SYMBOL CODE (SHIFTED TO THE RANGE 1,2...) IN C PAIRS CORRESPONDING TO THE LOWER AND UPPER LIMITS RESPECTIVELY. C EACH LIMIT MAY HAVE MORE THAN ONE SET OF PARAMETERS. THE ARRAY C CONTAINS THE INDEX OF EACH SET OF PARAMETERS FOR EACH SYMBOL C TYPE, IN THE ORDER LOWER(1), UPPER(1), LOWER(2), UPPER(2), .... C THERE MUST BE ONE EXTRA AT THE END OF . C C C OPEN SYMBOLS DATA C BYTE ISYM1 REAL XPTS(17), YPTS(17) INTEGER START(9), VERTEX(45) DATA XPTS / 0.0, 0.0, 0.25, 5*0.5, 0.25, 0.0, -0.25, 5*-0.5, -0.25 / DATA YPTS / 0.0, 3*0.5, 0.25, 0.0, -0.25, 5*-0.5, -0.25, 1 0.0, 0.25, 2*0.5 / DATA VERTEX / 1 4, 8, 12, 16, 4, !-65 = SQUARE 2 2, 8, 12, 2, !-66 = DELTA 3 3, 5, 7, 9, 11, 13, 15, 17, 3, !-67 = CIRCLE 4 2, 6, 10, 14, 2, !-68 = DIAMOND 5 4, 10, 16, 4, !-69 = DEL 6 2, 10, 1, 6, 14, !-70 = PLUS 7 4, 12, 1, 16, 8, !-71 = TIMES 8 2, 7, 13, 2, 5, 10, 15, 5 / !-72 = STAR DATA START / 1, 6, 10, 19, 24, 28, 33, 38, 46 / .NOCONDLIST C C SOLID SYMBOLS DATA C .IFDF SOLID REAL A(12), B(12) INTEGER BEGIN(11) C C 97=SOLID SQUARE, 98=SOLID DELTA, 100=SOLID DIAMOND, 101=SOLID DEL C DATA A/0.0, 0.0, 0.0, 2.0, -2.0, -1.0, 1.0, 1.0, -1.0, -2.0, 2.0, 0.0 / DATA B/-0.5, 0.5, -0.5, 0.5, 0.5, -0.5,-0.5, 0.5, 0.5, -0.5, -0.5, 0.5/ DATA BEGIN / 1, 2, 3, 4, 6, 6, 6, 8, 10, 12, 13 / DATA WIDTH / 0.01 / !WIDTH OF PENSTROKES IN INCHES FOR SOLID SYMBOLS .ENDC C C START HERE C ISYM2 = ISYM1 !CONVERT BYTE TO INTEGER ISYM = IABS(ISYM2) !IGNORE SIGN OF ISYM1 .IFNDF SOLID IF (ISYM .GT. 72) ISYM = ISYM-32 !SOLIDS ARE DRAWN WITH OPENS .ENDC .IFDF SOLID IF (ISYM .GE. 97) GO TO 100 !SOLID SYMBOL IF (ISYM .EQ. 67) GO TO 100 !OPEN CIRCLE DRAWN SPECIALLY .ENDC C C OPEN SYMBOLS C 50 ISYM0 = MAX0( 1, MIN0( (ISYM-64), 8 ) ) IPENUP = 3 !PEN UP FOR J=START(ISYM0), START(ISYM0+1)-1 { K = VERTEX(J) CALL PLOT ( X+XPTS(K)*HEIGHT, Y+YPTS(K)*HEIGHT, IPENUP ) IPENUP = 2 } RETURN C C SOLID SYMBOLS C .IFDF SOLID 100 IFF (ISYM .EQ. 99 .OR. ISYM .EQ. 67) THEN { C C CIRCLE IS DRAWN SPECIALLY C IPENUP = 3 RADIUS = HEIGHT/2.0 WHILE (RADIUS .GE. 0.0) { RADIUS = AMAX1( 0.0, RADIUS ) NSEG = AMAX1( RADIUS * 180.0, 2.0 ) !NUMBER OF LINE SEGMENTS PER CIRCLIE DTHETA = 6.2831853 / (NSEG-1) !ANGLE INCREMENT THETA = 0.0 FOR J=1,NSEG { XP = X + RADIUS*COS(THETA) YP = Y + RADIUS*SIN(THETA) CALL PLOT (XP, YP, IPENUP) IPENUP = 2 THETA = THETA + DTHETA } IF (ISYM .EQ. 67) RETURN !OPEN CIRCLE FINISHED RADIUS = RADIUS - WIDTH } RETURN } C C THE REST OF THE SOLID SYMBOLS FROM TABLES C ISYM0 = MAX0( 97, MIN0( ISYM, 101 ) ) INDEX = (ISYM0-96)*2 - 1 !INDEX INTO BEGIN XS = -0.5 WHILE (XS .LE. 0.5) { XS = AMIN1( XS, 0.5 ) !ACCOUNT FOR UNEVEN RIGHT EDGE YMIN = -100.0 YMAX = 100.0 FOR J = BEGIN(INDEX), BEGIN(INDEX+1)-1 YMIN = AMAX1( YMIN, A(J)*XS + B(J) ) FOR J = BEGIN(INDEX+1), BEGIN(INDEX+2)-1 YMAX = AMIN1( YMAX, A(J)*XS + B(J) ) XP = X + XS*HEIGHT CALL PLOT (XP, Y + YMIN*HEIGHT, 3) CALL PLOT (XP, Y + YMAX*HEIGHT, 2) XS = XS + WIDTH } ISYM = ISYM0-32 !PLACE OPEN SYMBOL AROUND IT TO CLEAN EDGES GO TO 50 .ENDC END