SUBROUTINE DONNA( XC, YC, NC, IC, ILINE, 1 XS, YS, NS, IS, DIA, ISYMB ) C C This routine is capable of producing a curve that will not pass C through any of the specified symbols. The symbols need not be C located on the curve. C C XC, YC Arrays which contain the coordinates for the C curve in units of the axes. C NC Number of points in the above arrays. C IC Interleave factor. C ILINE Type of line, if 0 then only symbols will be C generated, see DSHPLT for line types. C XS, YS Arrays which contain the coordinates for the C symbols in units of the axes. C NS Number of points in the above arrays. C IS Interleave factor. C DIA Diameter of the symbols in inches, if 0. then C the curve will be generated. C ISYMB Type of symbol, See SYMBOL. C C Note: If both symbols and the curve are to be plotted, the C coordinate values for each must be such that they will C be generated from left to right. C DIMENSION XC(1), YC(1), XS(1), YS(1) C C - CORRECT NUMBER OF ARGUMENTS? NARG = 0 CALL NUMARG( NARG ) IF( NARG .EQ. 11 ) GO TO 100 CALL OTSERR( 80 ) RETURN C C - DRAW JUST THE CURVE? 100 IF( ( DIA .GT. 0. ) .AND. ( NS .GT. 0 ) ) GO TO 1100 C C - CONSTRUCT THE CURVE. IPEN = 3 DO 1000 J=1,NC,IC CALL PSTN( XC(J), YC(J), XP, YP ) CALL DSHPLT(XP,YP,IPEN,ILINE) 1000 IPEN = 2 RETURN C C - GENERATE THE SYMBOLS. 1100 DO 2000 K=1,NS,IS CALL PSTN( XS(K), YS(K), XP, YP ) 2000 CALL SYMBOL(XP,YP,DIA,ISYMB) C C - GENERATE JUST THE SYMBOLS? IF( ( NC .LE. 1 ) .OR. ( ILINE .EQ. 0 ) ) RETURN C C - GENERATE A CURVE NOT INTERSECTING THE SYMBOLS. J = 1 K = 1 CALL PSTN( XS(K), YS(K), XPS, YPS ) RADIUS = DIA*.75 CALL PSTN( XC(J), YC(J), XCR, YCR ) XP = XCR YP = YCR IPEN = 3 CALL DSHPLT(XP,YP,IPEN,ILINE) IPEN = 2 C C - GO TO NEXT POINT ALONG CURVE. 2100 J = J + IC IF( J .GT. NC ) RETURN C XCL = XCR YCL = YCR CALL PSTN( XC(J), YC(J), XCR, YCR ) SLOPE = ( YCR - YCL )/( XCR - XCL ) YI = YCR - SLOPE*XCR C C C - IS CURVE ALREADY PAST THE SYMBOL? 2200 IF( XP .LE. XPS + RADIUS ) GO TO 3100 C C - MOVE TO NEXT SYMBOL. 2300 K = K + IS IF( K .GT. NS ) GO TO 2400 CALL PSTN( XS(K), YS(K), XPS, YPS ) GO TO 2200 C C - NO MORE SYMBOLS, FINISH CURVE. 2400 CALL DSHPLT(XP,YP,IPEN,ILINE) IPEN = 2 DO 3000 I=J,NC,IC CALL PSTN( XC(I), YC(I), XP, YP ) 3000 CALL DSHPLT(XP,YP,IPEN,ILINE) RETURN C C - IS OTHER END OF CURVE NOT YET TO SYMBOL? 3100 IF( XCR .GE. XPS - RADIUS ) GO TO 3200 C C - FINISH THIS SEGMENT AND CONTINUE. IPEN = 2 XP = XCR YP = YCR CALL DSHPLT(XP,YP,IPEN,ILINE) GO TO 2100 C C - FIND IF SYMBOL INTERFERS WITH CURVE. 3200 A = 1 + SLOPE**2 B = -XPS + SLOPE*YI - SLOPE*YPS C = XPS**2 + YI**2 - 2.*YI*YPS + YPS**2 - RADIUS**2 D = B**2 - A*C C C - IF DETERMINANT 0 (OR CLOSE TO 0), NO INTERSECTION. IF( D .GE. 1.E-4 ) GO TO 3300 C C - NO INTERSECTION, MOVE ALONG CURVE. IPEN = 2 CALL DSHPLT(XP,YP,IPEN,ILINE) GO TO 2300 C C - FIND POINT(S) OF INTERSECTION. 3300 XL = ( -B - SQRT(D) )/A YL = SLOPE*XL + YI XR = ( -B + SQRT(D) )/A YR = SLOPE*XR + YI C C - DRAW CURVE IN. IF( XCR .GE. XL ) GO TO 3400 XP = XCR YP = YCR CALL DSHPLT(XP,YP,IPEN,ILINE) GO TO 2100 3400 IF( XP .GT. XL ) GO TO 3500 CALL DSHPLT(XL,YL,IPEN,ILINE) IPEN = 3 3500 IF( XCR .GT. XR ) GO TO 3600 XP = XCR YP = YCR IPEN = 3 GO TO 2100 3600 XP = XR YP = YR IPEN = 3 CALL DSHPLT(XP,YP,IPEN,ILINE) IPEN = 2 GO TO 2300 C END