1000 REM THIS IS FILE "GRAPH.BAS" 1010 1100 REM ************************ 1110 REM ** FUNCTION GRAPHER ** 1120 REM ************************ 1140 1150 REM ...... FOLLOWING ARE THE Y/X DIMENSIONS OF THE OUTPUTTED CHARACTERS 1160 CRTD=10/4 1170 PRTD=10/6 1180 STRSIZ 1 1190 CHAR$="*" 1200 1210 DIM IMAGE$(80,60) 1220 DIM A(600),B(600), LIBT0(50),LIBT1(50),LIBPT(50) 1230 OPEN #1, "GRAPH.LST", OUTPUT 1240 1250 REM ...... SETS UP PARAMETERS FOR LIBRARY FUNCTIONS & THEN RETURNS ...... 1260 GO TO 9100 1270 1300 REM ...... DISPLAY DIRECTIONS ...... 1310 STRSIZ 43 1320 COMD$="HLP" 1330 PRINT 1400 PRINT "ENTER DESIRED PROCEDURE :" 1410 PRINT " 'LIB' --- CHOSE A FUNCTION FROM MY LIBRARY (TRY IT !)" 1420 PRINT " 'OLD' --- USE SAME FUNCTION AS LAST RUN" 1430 PRINT " 'OWN' --- ENTER YOUR OWN FUNCTION (CAREFUL !)" 1440 PRINT " 'HLP' --- HELP (DISPLAYS THIS EXPLANATION AGAIN)" 1450 PRINT " 'END' --- END THIS PROGRAM" 1500 PRINT "OPTIONS AVAILABLE (ENTER WITH THE ABOVE COMMANDS) :" 1510 PRINT " 'OVERLAY' --- COMBINES OUTPUT WITH LAST GRAPH (!)" 1520 PRINT " 'UNDISTORTED' --- DRAWS X & Y IN TRUE RATIO" 1530 PRINT " 'PRINTER' --- OUTPUTS GRAPH TO PRINTABLE FILE" 1540 PRINT " 'NO-OUTPUT' --- NO OUTPUT (USE WITH 'PRINT'/'OVERLAY')" 1550 1600 REM ...... EXECUTION LOOP STARTS HERE ...... 1610 OUT=0 1620 XLINE=78 1630 YLINE=22 1640 DIST=CRTD 1650 INPUT COMD$ 1660 1700 REM ...... CHECK FOR LINEPRINTER OUTPUT ...... 1710 IF( INSTR(1,COMD$,"PRINTER") = 0) GO TO 1800 1720 OUT=1 1730 XLINE=78 1740 YLINE=58 1750 DIST=PRTD 1800 OPER$=LEFT$(COMD$,3) 1810 1900 REM ...... CHECK FOR THE VARIOUS OPERATIONS ...... 1910 IF(OPER$="END") GO TO 9900 1920 IF(OPER$="OLD") GO TO 2200 1930 IF(OPER$="LIB") GO TO 7100 1940 IF(OPER$="OWN") GO TO 2000 1950 GO TO 1300 1960 2000 REM ...... USER DEFINES OWN FUNCTION ...... 2010 PRINT 2020 PRINT "TO IMPLEMENT YOUR OWN FUNCTION :" 2030 PRINT " LIST LINES 3000-3001 OF BASIC PROGRAM & EDIT ACCORDINGLY" 2040 PRINT " HAVE YOU ALREADY DONE THIS ? (TYPE 'Y' OR 'N') :" 2050 LIB=0 2060 INPUT NOYES$ 2070 IF(NOYES$="Y") GO TO 2300 2080 PRINT "BYE --- SEE YOU AFTER EDITTING !" 2090 GO TO 9920 2100 2200 REM ...... SET UP PARAMETERS FOR NEXT FUNCTION RUN ('LIB') ...... 2210 IF(LIB = 0) GO TO 2300 2220 T0=LIBT0(LIB) 2230 T1=LIBT1(LIB) 2240 POINT=LIBPT(LIB) 2250 GO TO 2400 2260 2300 REM ...... ENTER PARAMETERS FOR NEXT FUNCTION RUN ('OLD' OR 'OWN') ...... 2310 PRINT 2320 PRINT "ENTER (1) FIRST T VALUE , (2) LAST T VALUE , (3) # OF POINTS" 2330 INPUT T0,T1,POINT 2340 2400 REM ...... SET UP & CHECK INCREMENTS ('OLD' , 'OWN' , 'LIB') ...... 2410 IF(POINT > 600) LET POINT=600 2420 IF(POINT < 5) LET POINT= 5 2430 DT=(T1-T0)/(POINT-1) 2440 2500 REM ...... CHECK FOR OVERLAY OPTION ...... 2510 IF( INSTR(1,COMD$,"OVERLAY") > 0) GO TO 2600 2520 REM ...... CLEAR IMAGE (OUTPUT) AREA ...... 2540 2600 REM ...... LOOP TO COMPUTE GRAPH POINT COORDINATES ...... 2610 PRINT "PLEASE WAIT WHILE I COMPUTE ......" 2620 FOR I=1 TO POINT 2630 T=T0+DT*(I-1) 2640 IF(LIB <> 0) GO TO 8010 2700 2710 REM ********************************* 2720 REM ** ENTER FUNCTION IN FORM : ** 2730 REM ** X = < FUNCTION OF T > ** 2740 REM ** Y = < FUNCTION OF T > ** 2750 REM ** IN LINES 3000 & 3001 ** 2760 REM ** ** 2770 3000 X=T 3001 Y=T/(T+1)*(T-1) 3100 3110 REM ** ** 3120 REM ********************************* 3130 3200 A(I)=X 3210 B(I)=Y 3220 NEXT I 3230 3300 REM ...... DETERMINE RANGE LIMITS OF BOTH X & Y ...... 3310 XMIN=A(1) : XMAX=A(1) 3320 YMIN=B(1) : YMAX=B(1) 3400 FOR I=2 TO POINT 3410 IF(A(I) < XMIN) LET XMIN=A(I) 3420 IF(A(I) > XMAX) LET XMAX=A(I) 3430 IF(B(I) < YMIN) LET YMIN=B(I) 3440 IF(B(I) > YMAX) LET YMAX=B(I) 3450 NEXT I 3460 XRANG=XMAX-XMIN 3470 YRANG=YMAX-YMIN 3480 3500 XFACT=1 3510 YFACT=1 3520 3600 REM ...... CHECK FOR USER WANTING UNDISTORTED X/Y AXES ...... 3630 IF( INSTR(1,COMD$,"UNDISTORTED") = 0) GO TO 3700 3640 SFACT= (YRANG/XRANG) / (DIST*YLINE/XLINE) 3650 IF(SFACT > 1) LET XFACT=1/SFACT 3660 IF(SFACT < 1) LET YFACT=SFACT 3670 3700 REM ...... PUT GRAPH POINTS INTO DISPLAY ARRAY ('IMAGE$') ...... 3710 FOR I=1 TO POINT 3720 X=( (A(I)-XMIN)/XRANG ) * XLINE * XFACT + 1 3730 Y=( (B(I)-YMIN)/YRANG ) * YLINE * YFACT + 1 3740 Y=2+YLINE-Y 3750 IMAGE$(X,Y)=CHAR$ 3760 NEXT I 3770 3800 REM ...... CHECK FOR NO-OUTPUT OPTION ...... 3810 IF( INSTR(1,COMD$,"NO-OUTPUT") > 0) GO TO 3900 3820 PRINT #OUT : PRINT #OUT 3830 FOR I=1 TO YLINE 3840 FOR J=1 TO XLINE 3850 PRINT #OUT, USING "!", IMAGE$(J,I); 3860 NEXT J 3870 PRINT #OUT 3880 NEXT I 3890 3900 REM ...... PREPARE FOR NEXT GRAPH ...... 3910 COMD$="HLP" 3920 PRINT "ENTER DESIRED PROCEDURE :"; 3930 GO TO 1600 3940 3950 3960 6010 REM ********************************************************** 6020 REM ** ** 6030 REM ** ------ LIBRARY OF GRAPH SAMPLES ------ ** 6040 REM ** ** 6050 REM ** TO INCLUDE A NEW FUNCTION, INSERT SIUTABLE BASIC ** 6060 REM ** CODE LINES TO THE ENDS OF SECTIONS (1) , (2) , (3) ** 6070 REM ********************************************************** 6080 6090 7010 REM ************************* 7020 REM ** (1) GRAPH TITLES ** 7030 REM ************************* 7040 7100 PRINT 7110 PRINT " NN DESCRIPTION OF FUNCTION-GRAPH" 7120 PRINT " -- -----------------------------" 7201 PRINT " 01 DECAYING OSCILLATION" 7202 PRINT " 02 CLOVER LEAF" 7203 PRINT " 03 5TH-DEGREE POLYNOMIAL" 7204 PRINT " 04 CIRCLE" 7205 PRINT " 05 RECIPROCAL FUNCTION" 7206 PRINT " 06 PARABOLA" 7207 PRINT " 07 SPIRAL" 7280 REM ...... PUT NEW FUNCTION DESCRIPTIONS AT END OF ABOVE LIST ...... 7290 PRINT 7300 7310 PRINT "ENTER NN : "; 7320 INPUT LIB 7330 GO TO 2200 7340 8001 REM **************************** 8002 REM ** (2) GRAPH FUNCTIONS ** 8003 REM **************************** 8004 8010 REM ...... DECAYING OSCILLATIONS ...... 8011 IF(LIB <> 1) GO TO 8020 8012 X=T 8013 Y=SIN(T)*EXP(-T/50) 8014 GO TO 8900 8015 8020 REM ...... CLOVER LEAF FUNCTION ...... 8021 IF(LIB <> 2) GO TO 8030 8022 LEAF=5 8023 F=COS(LEAF*T)+1 8024 X=SIN(T)*F 8025 Y=COS(T)*F 8026 GO TO 8900 8027 8030 REM ...... 5TH-DEGREE POLYNOMIAL ...... 8031 IF(LIB <> 3) GO TO 8040 8032 X=T 8033 Y=(T-2)*(T-1)*T*(T+1)*(T+2) 8034 GO TO 8900 8035 8040 REM ...... CIRCLE ...... 8041 IF(LIB <> 4) GO TO 8050 8042 X=SIN(T) 8043 Y=COS(T) 8044 GO TO 8900 8045 8050 REM ...... RECIPROCAL FUNCTION ...... 8051 IF(LIB <> 5) GO TO 8060 8052 X=T 8053 Y=1/T 8054 GO TO 8900 8055 8060 REM ...... PARABOLA ...... 8061 IF(LIB <> 6) GO TO 8070 8062 X=T 8063 Y=T*T 8064 GO TO 8900 8065 8070 REM ...... SPIRAL ...... 8071 IF(LIB <> 7) GO TO 8080 8072 X=T*SIN(T) 8073 Y=T*COS(T) 8074 GO TO 8900 8075 8080 REM ...... NEW FUNCTIONS GO HERE ...... 8081 8082 8800 REM ...... LIBRARY FUNCTION NUMBER OUT OF PRESENT RANGE ...... 8810 PRINT "NON-EXISTANT LIBRARY FUNCTION (NUMBER) CALLED" 8820 GO TO 1400 8830 8900 REM ...... RETURN TO FUNCTION COMPUTATION AREA IN MAIN PROGRAM ...... 8910 GO TO 3200 8920 8930 9010 REM ***************************** 9020 REM ** (3) GRAPH PARAMETERS ** 9030 REM ***************************** 9040 9100 REM ...... INCREMENT NUMFN WHENEVER ANOTHER FUNCTION IS ADDED ...... 9110 NUMFN=7 9120 FOR I=1 TO NUMFN 9130 READ LIBT0(I),LIBT1(I),LIBPT(I) 9140 NEXT I 9150 9200 REM ...... T PARAMETERS FOLLOW (FIRST T, LAST T, # OF POINTS) ...... 9201 DATA -25 25 600 9202 DATA 0 6.30 600 9203 DATA -2 2 400 9204 DATA 0 6.30 250 9205 DATA -1 1 40 9206 DATA -1 1 150 9207 DATA 0 20 600 9300 9310 REM ...... ADD NEW FUNCTION PARAMETERS TO END OF ABOVE LIST ...... 9320 LIB=0 9330 GO TO 1300 9340 9350 9900 REM ...... EXIT FROM PROGRAM ...... 9910 PRINT "TO GET PRINTER OUTPUT (IF ANY), ENTER 'BYE' THEN 'PRINT GRAPH' " 9920 CLOSE #1 9990 END