SUBROUTINE SCPLOT(X,Y,ISIZE) C C THIS SUBROUTINE TAKES AN ARRAY OF X,Y COORDINATES OF SIZE=ISIZE C AND PLOTS THEM ON A TERMINAL WITH 1024 BY 780 RESOLUTION. C IF ISIZE < 0 THEN THE PLOT BEGINS WITH THE FIRST POINT. C IF ISIZE > 0 THEN THE PLOT CONTINUES WHERE THE LAST CALL TO SCPLOT C LEFT OFF. IF THE LINES ARE OUTSIDE OF THE ACTIVE AREA THEY ARE CUT C SHORT. SCALE FACTORS MAY BE ENTERED THROUGH 'PSSCAL'. C REAL X(1),Y(1) INTEGER IX(60),IY(60) DATA XMAX / 1023.9/, YMAX / 779.9/ !MAX SCREEN SIZES DATA XO,YO,XSCAL,YSCAL/0.,0.,1.,1./ !INITIAL SCALE FACTORS ISIZ = ISIZE IF(ISIZE .GT. 0)GO TO 50 !CONTINUE FROM OLD X,Y ISIZ = - ISIZ X0 = (X(1) - XO)/XSCAL !STARTING POINT OF PLOT X Y0 = (Y(1) - YO)/YSCAL !Y STARTING POINT IF(ISIZ .LE. 1)RETURN !IF NO VECT MERELY SAVE X0,Y0 50 IA = 1 DO 600 I = 1,ISIZ X0SAV = X0 XSAV = (X(I) - XO)/XSCAL !SCALED X POSITION XT = XSAV YSAV = (Y(I) - YO)/YSCAL !SCALED Y POSITION YT = YSAV C C TRUNCATE THE VECTORS C IF(X0 .GT. XT)GO TO 100 CALL XYTRNK(X0,XT,Y0,YT,XMAX,IGOOD) !TRUNCATE X GO TO 200 100 CALL XYTRNK(XT,X0,YT,Y0,XMAX,IGOOD) !TRUNCATE X 200 IF(IGOOD .EQ. 0)GO TO 420 IF(Y0 .GT. YT)GO TO 300 CALL XYTRNK(Y0,YT,X0,XT,YMAX,IGOOD) !TRUNCATE Y GO TO 400 300 CALL XYTRNK(YT,Y0,XT,X0,YMAX,IGOOD) !TRUNCATE Y 400 CONTINUE IF(IGOOD .EQ. 0)GO TO 420 !DO PLOT SINCE IT IS BROKEN LINE SEGMENT IF(IA .EQ. 10) GO TO 420 !DO PLOT TO EMPTY BUFFER IF(X0 .EQ. X0SAV .AND. XT .EQ. X(I))GO TO 450 !NO CHANGES IN XY 420 IF(IA .GT.1 )CALL VECT(IX,IY,-IA) IA = 1 IF(IGOOD .EQ. 0)GO TO 500 450 CONTINUE IF(IA .GT. 1)GO TO 460 !DO NOT DO X0,Y0 IX(1) = X0 !SET UP FIRST POINT IY(1) = Y0 460 IA = IA + 1 !COUNT # OF POINTS TO PLOT IX(IA) = XT IY(IA) = YT 500 CONTINUE X0 = XSAV !SAVE NEXT STARTING POINT Y0 = YSAV 600 CONTINUE IF(IA .GT. 1)CALL VECT(IX,IY,-IA) !IF POINTS LEFT OVER PLOT THEM RETURN C C HERE IS SEPARATE ENTRY TO DO SCALING C ENTRY PSSCAL(X1,X2,X3,X4) C C CALL PSSCAL(X0,XSCAL,Y0,YSCAL) C C X0 = OROGIN OF X COORDINATES C XSCAL = # OF USER UNITS /SCREEN STEP C SCREEN STEP = .1" APPROXIMATELY C XO = X1 XSCAL = X2 YO = X3 YSCAL = X4 IF(XSCAL .EQ. 0)XSCAL = 1. !PREVENT ZERO SCALE VALUES IF(YSCAL .EQ. 0)YSCAL = 1. RETURN ENTRY SCTONE(X,Y,ISIZE) C C SUBROUTINE TO PRODUCE SHADED PICTURE (SIMILAR TO VERSATEC TONE) C C X,Y = ARRAY OF COORDINATES FORMING A CLOSED POLYGON C ISIZE = NUMBER OF POINTS C CALL SCTEST(ITST,,,,,,MY,MX,MYRES,MXRES) IF(ITST .eq. 0) RETURN ! No plots possible MIN = MX+1 !SET UP TO FIND MIN,MAX MAX = 0 DO 710 J = 1,ISIZE !SEARCH THRU ALL POINTS TEMP = ( X(J) - XO )/XSCAL IF(TEMP .LT. 0.) TEMP = 0. IF(TEMP .GT. MX) TEMP = MX IF(TEMP .LT. MIN) MIN = TEMP IF(TEMP .GT. MAX) MAX = TEMP 710 CONTINUE LINE = -1 ! Current line number FAC = FLOAT(MXRES)/(MX+1) ! Resolution DO 800 IXP = MIN,MAX ! SHADE OVER ALL VALUES XPT = IXP JLINE = XPT*FAC ! Current line number IF(JLINE .eq. LINE) Go to 800 ! Current line already done ? ISZ = 0 !WILL BE # OF SEGMENTS DO 780 J = 1,ISIZE !LOOK FOR HORIZ. BOUNDARIES K = J - 1 !J,K DEFINE PT. # AT ENDS OF LINES IF(K .LT. 1) K = ISIZE !FIRST,LAST POINT JOIN XA = ( X(K) - XO )/XSCAL XB = ( X(J) - XO )/XSCAL IF(XPT .GE. XA .AND. XPT .LT. XB) GO TO 740 IF(XPT .LT. XA .AND. XPT .GE. XB) GO TO 740 GO TO 780 !NO HORIZONTAL SEGMENT FOUND, DONE 740 YB = ( Y(J) - YO )/YSCAL YA = ( Y(K) - YO )/YSCAL TEMP = XB - XA IF(TEMP .EQ. 0.) GO TO 750 TEMP = (YB - YA)/TEMP 750 TEMP = YA + (XPT - XA) * TEMP IF(TEMP .LT. 520) GO TO 751 751 CONTINUE IF(TEMP .LT. 0.)TEMP = 0. !MINIMUM Y VALUE IS 0 IF(TEMP .GT. 779.)TEMP = 779. !MAXIMUM IS 779. ISZ = ISZ + 1 !NUMBER OF BOUNDARIES FOUND IY(ISZ) = TEMP !Y BOUNDARIES IF(ISZ .GE. 50) GO TO 781 !DONE 780 X1 = X2 781 IF(ISZ .LE. 0) GO TO 800 !NO DATA TO PLOT DO 785 I = 1,ISZ !PUT Y VALUES INTO ASCENDING ORDER IX(I) = IXP !X VALUE CORRESPONDING TO Y DO 785 J = I,ISZ IF(IY(J) .GE. IY(I)) GO TO 785 !IF LOWER INDEX VALUE NOT SMALLER K = IY(J) !SWAP THEM IY(J) = IY(I) IY(I) = K 785 CONTINUE DO 790 I = 1,ISZ,2 !PLOT ALL SEGMENTS IY(I) = - IY(I) !START NEW VECTOR 790 CONTINUE CALL VECT(IX,IY,-ISZ) !PLOT IT 800 LINE = JLINE END SUBROUTINE XYTRNK(X0,X,Y0,Y,AMAX,IGOOD) C C SPECIAL SUBROUTINE TO TRUNCATE X VALUES OF VECTOR TO THE RANGE C 0 TO AMAX. X0 < X IS ASSUMED. C IF(X0 .GT. AMAX)GO TO 500 !NO GOOD IF(X .LT. 0. )GO TO 500 IF(X0 .GE. 0. )GO TO 200 !X0 IS WITHIN RANGE IF(X - X0 .LE. 0.1)GO TO 500 !NO GOOD Y0 = Y0 - X0 * (Y-Y0) / (X-X0) !NEW Y0 X0 = 0. !NEW X0 WITHIN RANGE 200 CONTINUE IF(X .LE. AMAX)GO TO 400 !X IS AOK IF(X - X0 .LE. 0.1)GO TO 500 !DIFFERENCE TOO SMALL Y = Y0 + (AMAX-X0) * (Y-Y0) / (X-X0) !NEW Y VALUE X = AMAX !NEW X VALUE 400 IGOOD = -1 !OK RETURN 500 IGOOD = 0 !NOT GOOD END