SUBROUTINE ARC(X,Y,NASK,EPS,XC,YC,NRET) C GIVEN FOUR SUCCESSIVE POINTS X(K),Y(K),K=1,4 DEFINING 3 SEGMENTS, C THE POINTS XC(K),YC(K),K=1,NRET ARE GENERATED DESCRIBING A CURVE C BETWEEN POINTS 2 AND 3 TRYING TO MATCH SLOPE WITH SIMILAR CURVES C FROM 1 TO 2 AND FROM 3 TO 4. IF THE SEGMENT (2,3) IS LESS THAN EPS C IN LENGTH,NRET IS SET TO 2 AND POINTS 2 AND 3 ONLY ARE RETURNED IN C ARRAYS XC,YC. OTHERWISE NRET = THE INPUT PARAMETER NASK. C THE CURVE XC,YC IS A CUBIC OVER SEGMENT (2,3). C IF SEGMENT (1,2) IS LESS THAN EPS THE SECOND DERIVATIVE AT C POINT 2 IS SET TO ZERO. IF SEGMENT (3,4) IS LESS THAN EPS C THE SECOND DERIVATIVE AT POINT 3 IS SET TO ZERO. THESE TWO C FEATURES MAY BE USED FOR STARTING AND ENDING AN OPEN CURVE. C OCEANOGRAPHY EMR DECEMBER 1969 C REAL*4 EPS REAL*4 XC(1), YC(1) REAL*4 X(4),Y(4),SLOPE(3),DS(3) REAL*4 PI, HAFPI, ANGMAX, XCENT, YCENT REAL*4 DX2, DY2, DS2, ANG2, SIN2, COS2 REAL*4 DX, DY, ANG, C, D, XT, YT DATA PI, HAFPI, ANGMAX/3.1415926,1.570796,0.7853981/ C IF(NASK-2) 10,10,20 10 NRET=2 XC(1)=X(2) YC(1)=Y(2) XC(2)=X(3) YC(2)=Y(3) RETURN C 20 CONTINUE XCENT = (X(2)+X(3))*.5 YCENT = (Y(2)+Y(3))*.5 DX2= X(3)-X(2) DY2= Y(3)-Y(2) DS2 = SQRT(DX2*DX2+DY2*DY2) IF(DS2-EPS)10,30,30 30 ANG2=ATAN2(DY2,DX2) COS2 = COS(ANG2) SIN2 = SIN(ANG2) C DO 130 K=1,3,2 DX = X(K+1)-X(K) DY = Y(K+1)-Y(K) DS(K)=SQRT(DX*DX + DY*DY) SLOPE(K)=0. IF(DS(K)-EPS) 130,40,40 40 ANG =(ATAN2(DY,DX) - ANG2)*.5 IF(ANG-HAFPI) 60,60,50 50 ANG = ANG-PI 60 IF(ANG+HAFPI) 70,80,80 70 ANG = ANG+PI 80 IF(ANG-ANGMAX)100,100,90 90 ANG=ANGMAX 100 IF(ANG+ANGMAX)110,120,120 110 ANG=-ANGMAX 120 SLOPE(K)=SIN(ANG)/COS(ANG) 130 CONTINUE IF(DS(3)-EPS)132,134,134 132 SLOPE(3)=-SLOPE(1)*.5 134 IF(DS(1)-EPS)136,138,138 136 SLOPE(1)=-SLOPE(3)*.5 138 CONTINUE C= .25*(SLOPE(3)-SLOPE(1)) D= .25*(SLOPE(3)+SLOPE(1)) C NRET=NASK DX=2./(NRET-1) XT=-1.-DX DO 140 K=1,NRET XT=XT+DX YT=(C+D*XT)*(XT*XT-1.) XC(K)=(XT*COS2-YT*SIN2)*DS2*.5+XCENT 140 YC(K)=(XT*SIN2+YT*COS2)*DS2*.5+YCENT RETURN END