10 ' GRAPH-MASTER
20 ' By James Long
30 ' Amstrad Action August 1988
40 '
50 ' ** SET UP **
60 MODE 1:BORDER 2
70 INK 0,26:INK 1,0:INK 2,2:INK 3,6
80 WINDOW#1,1,40,23,25:p$=CHR$(184)
90 xmin=-5:xmax=5:ymin=-5:ymax=5:col=1
100 xinc=1:yinc=1:pmin=0:pmax=2:st%=4
110 GOSUB 300:GOSUB 450:GOSUB 1440
120 :
130 ' ** MAIN LOOP **
140 k$=UPPER$(INKEY$):k=VAL(k$)
150 IF k$="" THEN 140
160 IF k$="C" THEN GOSUB 650
170 IF k$="P" THEN GOSUB 760
180 IF k$="Y" THEN GOSUB 880:GOSUB 300
190 IF k$="R" THEN GOSUB 970:GOSUB 300
200 IF k$="A" THEN GOSUB 1060:GOSUB 300
210 IF k$="I" THEN GOSUB 1170:GOSUB 300
220 IF k$="G" THEN GOSUB 1260:GOSUB 300
230 IF k$="S" THEN GOSUB 1350: GOSUB 300
240 IF k$="0" OR k>0 AND k<4 THEN col=k:GOSUB 300
250 IF k$="W" THEN GOSUB 450
260 IF k$="Q" THEN MODE 1:END
270 GOTO 140
280 '
290 ' ** MAIN DISPLAY **
300 PAPER#1,1:CLS#1
310 LOCATE#1,1,1:PEN#1,0
320 PRINT#1,"Cpl,Ppl,Yeq,Req,Ax,Inc,";
330 PRINT#1,"rnG,St,0123,Wp,Qt"
340 LOCATE#1,1,2:PRINT#1,"xI";xinc;
350 PRINT#1,"yI";yinc;"col";
360 PAPER#1,0:PEN#1,col:PRINT#1,col;
370 PAPER#1,1:PEN#1,0
380 PRINT#1," ";pmin;CHR$(243);pmax;
390 PRINT#1,p$"rad St";st%
400 LOCATE#1,1,3:PRINT#1,"y=";y$;
410 PRINT#1," r=";r$
420 RETURN
430 '
440 ' ** DRAW AXES **
450 ORIGIN 0,48,0,640,400,48:CLG
460 xstep=640/(xmax-xmin)
470 ystep=352/(ymax-ymin)
480 xorig=-xmin*xstep:yorig=-ymin*ystep
490 xe=xorig:ye=yorig
500 IF xorig<320 THEN xe=640-xorig
510 IF yorig<176 THEN ye=352-yorig
520 PLOT 0,yorig,1:DRAWR 640,0
530 PLOT xorig,0:DRAWR 0,352
540 FOR x=0 TO xe STEP xstep*xinc
550 PLOT xorig+x,yorig-4:DRAWR 0,8
560 PLOT xorig-x,yorig-4:DRAWR 0,8
570 NEXT x
580 FOR y=0 TO ye STEP ystep*yinc
590 PLOT xorig-4,yorig+y:DRAWR 8,0
600 PLOT xorig-4,yorig-y:DRAWR 8,0
610 NEXT y
620 RETURN
630 '
640 ' ** PLOT CARTESIAN GRAPH **
650 ON ERROR GOTO 730
660 xc=0:s=st%/2
670 FOR x=xmin TO xmax STEP s/xstep
680 IF INKEY$=" " THEN RETURN
690 xc=xc+s:y=FNy(x)*ystep
700 PLOT xc,yorig+y,col
710 NEXT x
720 RETURN
730 RESUME NEXT
740 '
750 ' ** PLOT POLAR GRAPH **
760 ON ERROR GOTO 850
770 s=0.01*st%
780 FOR a=pmin*PI TO pmax*PI STEP s
790 IF INKEY$=" " THEN RETURN
800 x=COS(a)*FNr(a)*(xstep/PI)
810 y=SIN(a)*FNr(a)*(ystep/PI)
820 PLOT xorig,yorig,1:PLOTR x,y,col
830 NEXT a
840 RETURN
850 RESUME NEXT
860 '
870 ' ** CHOOSE CARTESIAN EQUATION **
880 CLS#1:PRINT#1,"Choose    (1)";a$
890 PRINT#1,"cartesian (2) ";b$
900 PRINT#1,"equation  (3) ";c$
910 k$=INKEY$:eq=VAL(k$)
920 IF eq<1 OR eq>3 THEN 910
930 ON eq GOSUB 1550,1570,1590
940 RETURN
950 '
960 ' ** CHOOSE POLAR EQUATION **
970 CLS#1:PRINT#1,"Choose   (1) ";d$
980 PRINT#1,"polar     (2) ";e$
990 PRINT#1,"equation  (3) ";f$
1000 k$=INKEY$:eq=VAL(k$)
1010 IF eq<1 OR eq>3 THEN 1000
1020 ON eq GOSUB 1620,1640,1660
1030 RETURN
1040 '
1050 ' ** ALTER RANGES OF AXES **
1060 CLS#1:PRINT#1,"Enter new ranges:"
1070 LOCATE #1,1,2
1080 INPUT#1,"xmin,xmax";xmin,xmax
1090 IF xmin>0 OR xmax<0 THEN 1070
1100 LOCATE #1,1,3
1110 INPUT#1,"ymin,ymax";ymin,ymax
1120 IF ymin>0 OR ymax<0 THEN 1100
1130 GOSUB 450
1140 RETURN
1150 '
1160 ' ** CHANGE INCREMENTS OF AXES **
1170 CLS#1
1180 PRINT#1,"Enter new increments:"
1190 LOCATE#1,1,2
1200 INPUT#1,"xI,yI";xinc,yinc
1210 IF xinc<=0 OR yinc<=0 THEN 1190
1220 GOSUB 450
1230 RETURN
1240 '
1250 ' ** ALTER POLAR GRAPH RANGE **
1260 CLS#1:PRINT#1,"Enter new range";
1270 PRINT#1,"for polar graph:"
1280 LOCATE#1,1,2
1290 PRINT#1,"pmin/"p$",pmax/"p$;
1300 INPUT#1,pmin,pmax
1310 IF pmin>=pmax THEN 1280
1320 RETURN
1330 '
1340 ' ** CHANGE PLOTTING-STEP **
1350 CLS#1:PRINT#1,"Enter new ";
1360 PRINT#1,"plotting-step"
1370 LOCATE#1,1,2
1380 INPUT#1,"(1 to 9) ";st%
1390 IF st%<1 OR st%>9 THEN 1370
1400 RETURN
1410 '
1420 ' ** EQUATIONS **
1430 ' Cartesian
1440 a$="(x/2)^3"
1450 b$="(x-2)/((x+1)*(x-2))"
1460 c$="x^2-4"
1470 ' Polar
1480 d$="a"
1490 e$="4*(2-sin(3*a))"
1500 f$="3*(3+COS(5*a))"
1510 RETURN
1520 '
1530 ' ** FUNCTIONS **
1540 ' Cartesian
1550 DEF FNy(x)=(x/2)^3
1560 y$=a$:RETURN
1570 DEF FNy(x)=(x-2)/((x+1)*(x-3))
1580 y$=b$:RETURN
1590 DEF FNy(x)=x^2-4
1600 y$=c$:RETURN
1610 ' Polar
1620 DEF FNr(a)=a
1630 r$=d$:RETURN
1640 DEF FNr(a)=4*(2-SIN(3*a) )
1650 r$=e$:RETURN
1660 DEF FNr(a)=3*(3+COS(5*a))
1670 r$=f$:RETURN
1680 '
1690 ' ** THE END **