home *** CD-ROM | disk | FTP | other *** search
AmigaBASIC Source Code | 1986-11-20 | 10.8 KB | 403 lines |
- CLS:COMMON flag,f$
- IF flag=1 THEN GOTO default
- start:
- MENU 1,0,0,"Project"
- MENU 1,1,1,"New Equation"
- MENU 1,2,0,"New Window"
- MENU 1,3,0,"See Graph"
- MENU 1,4,1,"Quit"
- MENU 2,0,0,"Surface Appearance"
- MENU 2,1,1,"Topside Color"
- MENU 2,2,1,"Bottomside Color"
- MENU 2,3,2," Opaque"
- MENU 2,4,1," Transparent"
- MENU 3,0,0,"Grid"
- MENU 3,1,1,"Color"
- MENU 3,2,2," x & y Lines"
- MENU 3,3,1," x Lines"
- MENU 3,4,1," y Lines"
- MENU 4,0,0,"Draw"
- MENU 4,1,1,"Start"
- MENU 4,2,0,"Stop"
- MENU 4,3,0,"Rescale"
- PALETTE 3,0.33,0.87,0
- LOCATE 1,34:COLOR 2,3:PRINT " 3D GRAPHING "
- prompt:
- COLOR 1,0:PRINT:f$=""
- PRINT "Enter function of x and y to be graphed:"
- PRINT
- INPUT "z=",f$
- eflag=0:ON ERROR GOTO 0
- IF f$="" THEN
- CLS:MENU RESET
- PALETTE 3,1,0.73,0
- CLEAR:END
- END IF
- OPEN "df1:equation" FOR OUTPUT AS 1
- PRINT #1,"100 z="+f$+":RETURN"
- CLOSE 1:flag=1
- CHAIN MERGE "df1:equation"
- default:
- m1=-2.5:m2=2.5:m3=-2.5:m4=2.5:col=60:azi=45:n=2
- DIM r(3),g(3),b(3)
- r(0)=0.4:g(0)=0.6:b(0)=1
- r(1)=1:g(1)=1:b(1)=1
- r(2)=0:g(2)=0:b(2)=0
- r(3)=0.33:g(3)=0.87:b(3)=0
- ON ERROR GOTO mischeck
- x=m2:y=m4:GOSUB 100:IF eflag THEN DELETE 100:BEEP:GOTO prompt
- setup:
- WINDOW 1,"3d Graphing"
- setup1:
- COLOR 1,0:CLS
- LOCATE 1,34:COLOR 2,3:PRINT" 3D GRAPHING "
- ln=LEN("z="+f$):tb=INT(40-ln/2):IF tb<0 THEN tb=0
- LOCATE 3,tb:COLOR 1,0:PRINT "z="+f$
- options:
- COLOR 3,2
- MENU 1,0,1:MENU 2,0,1:MENU 3,0,1
- MENU 4,0,1:MENU 4,1,1:MENU 4,2,0
- IF sflag THEN MENU 1,3,1:MENU 4,3,1
- IF wflag THEN MENU 1,2,1
- LOCATE 6,10
- PRINT " Minimum x-coordinate ":LOCATE 6,50:PRINT " Maximum x-coordinate "
- LOCATE 11,10
- PRINT " Minimum y-coordinate ":LOCATE 11,50:PRINT " Maximum y-coordinate "
- LOCATE 16,10
- PRINT " Colatitude ":LOCATE 16,50:PRINT " Azimuth "
- COLOR 2,1:LOCATE 7,10
- PRINT " ";m1;" ":LOCATE 7,50:PRINT " ";m2;" "
- LOCATE 12,10
- PRINT " ";m3;" ":LOCATE 12,50:PRINT " ";m4;" "
- LOCATE 17,10
- PRINT " ";col;" ":LOCATE 17,50:PRINT " ";azi;" "
- PRINT:COLOR 1,0
- PRINT
- PRINT " Select 'start' on draw menu to draw graph."
- selection:
- m=MENU(0):mo=MOUSE(0):m=0:mo=0
- loop:
- m=MENU(0):IF m THEN checkmenu
- mo=MOUSE(0):IF mo THEN adjust :ELSE loop
- checkmenu:
- ON m GOTO menu1,menu2,menu3,menu4
- menu1:ON MENU(1) GOTO newstart,newwindow,seegraph,quit
- menu2:ON MENU(1) GOTO top,bottom,opaq,trans
- menu3:ON MENU(1) GOTO gridcol,xygrid,xgrid,ygrid
- menu4:ON MENU(1) GOTO draw,endraw,rescale
- adjust:
- x%=MOUSE(1)/8:y%=MOUSE(2)/8
- IF y%<6 OR y%>17 THEN selection
- IF (x%<10 OR x%>70) OR (x%>30 AND x%<49) THEN selection
- IF x%>=49 THEN rightside
- IF y%=6 OR y%=7 THEN xmin
- IF y%=11 OR y%=12 THEN ymin
- IF y%=16 OR y%=17 THEN colatitude
- GOTO selection
- rightside:
- IF y%=6 OR y%=7 THEN xmax
- IF y%=11 OR y%=12 THEN ymax
- IF y%=16 OR y%=17 THEN azimuth
- GOTO selection
- xmin:
- GOSUB ghostmenu
- COLOR 2,1:LOCATE 7,10
- LINE INPUT " ";m1$:IF m1$="" THEN options
- IF m1$="0" THEN m1=0:GOTO options
- IF VAL(m1$)=0 THEN BEEP:GOTO xmin
- m1=VAL(m1$):GOSUB xstatus:GOTO options
- xmax:
- GOSUB ghostmenu
- COLOR 2,1:LOCATE 7,50
- LINE INPUT " ";m2$:IF m2$="" THEN options
- IF m2$="0" THEN m2=0:GOTO options
- IF VAL(m2$)=0 THEN BEEP:GOTO xmax
- m2=VAL(m2$):GOSUB xstatus:GOTO options
- ymin:
- GOSUB ghostmenu
- COLOR 2,1:LOCATE 12,10
- LINE INPUT " ";m3$:IF m3$="" THEN options
- IF m3$="0" THEN m3=0:GOTO options
- IF VAL(m3$)=0 THEN BEEP:GOTO ymin
- m3=VAL(m3$):GOSUB xstatus:GOTO options
- ymax:
- GOSUB ghostmenu
- COLOR 2,1:LOCATE 12,50
- LINE INPUT " ";m4$:IF m4$="" THEN options
- IF m4$="0" THEN m4=0:GOTO options
- IF VAL(m4$)=0 THEN BEEP:GOTO ymax
- m4=VAL(m4$):GOSUB xstatus:GOTO options
- colatitude:
- CLS:PRINT:GOSUB ghostmenu
- PRINT " Colatitude is the angle between the line of sight and the z-axis."
- PRINT " Specify a value between 0 and 180 degrees."
- PRINT
- INPUT ">",col:IF col<0 OR col>180 THEN BEEP:GOTO colatitude
- GOTO setup1
- azimuth:
- CLS:PRINT:GOSUB ghostmenu
- PRINT " Azimuth is the angle between the xz-plane and the plane containing"
- PRINT " the line of sight and the z-axis."
- PRINT
- PRINT " Specify a value between -180 and 180 degrees."
- PRINT
- INPUT ">",azi:IF azi<-180 OR azi>180 THEN BEEP:GOTO azimuth
- GOTO setup1
- newstart:
- inq$="New Equation":GOSUB confirm
- IF an$<>"Y" THEN selection
- CLS:FOR i=2 TO n:WINDOW CLOSE i:NEXT
- DELETE 100
- CLEAR:GOTO start
- newwindow:
- GOSUB ghostmenu
- hmem=FRE(-1):IF hmem>160000 THEN ask
- CLS:BEEP:PRINT"Not enough free memory."
- question:
- PRINT:INPUT"Do you wish to erase a current window (y/n)";an$
- IF UCASE$(an$)<>"Y" THEN setup
- PRINT:PRINT"Erase which one ( 1 -";n-1;")";:INPUT number
- IF number<1 OR number>n-1 THEN BEEP:GOTO question
- nflag=number+1:GOTO setup1
- ask:
- inq$="New Window":GOSUB confirm
- IF an$<>"Y" THEN selection
- create:
- n=n+1:WINDOW n,STR$(n-1)+")z="+f$,(1,10)-(617,162),23
- CLS:PRINT"Adjust window then press <RETURN>."
- adjwin:
- a$=INKEY$:IF a$<>CHR$(13) THEN adjwin
- WINDOW n,,,22
- GOTO setup
- seegraph:
- GOSUB ghostmenu
- FOR i=2 TO n:WINDOW i:NEXT
- GOTO pause
- quit:
- inq$="Quit":GOSUB confirm
- IF an$<>"Y" THEN selection
- COLOR 1,0:CLS:MENU RESET:ON ERROR GOTO 0
- FOR i=2 TO n:WINDOW CLOSE i:NEXT
- PALETTE 1,1,1,1
- PALETTE 2,0,0,0
- PALETTE 3,1,0.73,0
- DELETE 100:CLEAR:END
- top:
- CLS:LOCATE 1,29:COLOR 0,1:PRINT" Top Color Adjustment "
- COLOR 1,0:id=3
- GOTO figcolor
- bottom:
- CLS:LOCATE 1,28:COLOR 0,1:PRINT" Bottom Color Adjustment "
- COLOR 1,0:id=1
- GOTO figcolor
- opaq:
- opq$="y":MENU 2,3,2:MENU 2,4,1:MENU 2,1,1:MENU 2,2,1:GOTO selection
- trans:
- opq$="n":MENU 2,3,1:MENU 2,4,2:MENU 2,1,0:MENU 2,2,0:GOTO selection
- gridcol:
- CLS:LOCATE 1,29:COLOR 0,1:PRINT " Grid Color Adjustment "
- COLOR 1,0:id=2
- GOTO figcolor
- xygrid:
- gtype=0
- MENU 3,2,2:MENU 3,3,1:MENU 3,4,1
- GOTO selection
- xgrid:
- gtype=1
- MENU 3,2,1:MENU 3,3,2:MENU 3,4,1
- GOTO selection
- ygrid:
- gtype=2
- MENU 3,2,1:MENU 3,3,1:MENU 3,4,2
- GOTO selection
- rescale:
- GOSUB ghostmenu
- MENU 4,0,1:MENU 4,1,0:MENU 4,2,1:MENU 4,3,0
- FOR i=2 TO n:WINDOW i:NEXT:COLOR 1,0
- scale:
- GOSUB checkends
- IF wflag=0 THEN WINDOW 2,STR$(1)+")z="+f$,(1,10)-(617,162),23
- CLS:qflag=0:PRINT"***Surface Scaling in Progress***"
- pi=3.14159:co=col*pi/180:az=azi*pi/180
- l=1e+20:u=-l:a=l:r=u:ls=SIN(co):lc=COS(co):sa=SIN(az):ac=COS(az)
- cb=961:FOR x=m1 TO m2 STEP (m2-m1)/30
- FOR y=m3 TO m4 STEP (m4-m3)/30:cb=cb-1
- LOCATE 2,1:PRINT "Only ";cb;" more steps to go!"
- GOSUB 100
- z=z*ls-(x*ac+y*sa)*lc
- IF l>z THEN l=z
- IF u<z THEN u=z
- c=(y*ac-x*sa):IF a>c THEN a=c
- IF r<c THEN r=c
- IF MENU(0)=4 THEN
- IF MENU(1)=2 THEN
- inq$="Stop Scaling"
- WINDOW OUTPUT 1
- GOSUB confirm
- WINDOW OUTPUT n
- IF an$="Y" THEN x=m2:y=m4:qflag=1
- END IF
- END IF
- NEXT:NEXT:IF qflag THEN setup
- IF wflag=0 THEN WINDOW 2,,,22:wflag=1
- o=u-l:t=(r-a)/200:sflag=1
- draw:
- GOSUB checkends
- qflag=0:GOSUB ghostmenu
- MENU 4,0,1:MENU 4,1,0:MENU 4,2,1:MENU 4,3,0
- IF sflag=0 THEN scale
- FOR i=2 TO n:WINDOW i:NEXT:COLOR 1,0
- IF nflag THEN WINDOW nflag:COLOR 1,0
- CLS:w=WINDOW(2)-1:h=WINDOW(3)-1
- co=col*pi/180:az=azi*pi/180
- ls=SIN(co):lc=COS(co):sa=SIN(az):ac=COS(az)
- IF ABS(azi)<=90 THEN xbeg=m1:xend=m2:stpx=(m2-m1)/30 :ELSE xbeg=m2:xend=m1:stpx=(m1-m2)/30
- IF azi>=0 THEN ybeg=m3:yend=m4:stpy=(m4-m3)/30 :ELSE ybeg=m4:yend=m3:stpy=(m3-m4)/30
- FOR x=xbeg TO xend STEP stpx
- FOR y=ybeg TO yend STEP stpy
- GOSUB 100
- z=z*ls-(x*ac+y*sa)*lc
- y2=h-h*(z-l)/o:x2=w*((y*ac-x*sa)-a)/(200*t)
- ho=x:x=x-(m2-m1)/30:GOSUB 100
- z=z*ls-(x*ac+y*sa)*lc
- ly=h-h*(z-l)/o:lx=w*((y*ac-x*sa)-a)/(200*t)
- x2=CINT(ABS(x2)):y2=CINT(ABS(y2))
- lx=CINT(ABS(lx)):ly=CINT(ABS(ly)):x=ho
- IF opq$="n" THEN grid
- IF (x1>w OR x2>w) OR (lx>w OR ux>w) THEN nexprep
- IF (y1>h OR y2>h) OR (ly>h OR uy>h) THEN nexprep
- IF y1<>uy THEN xcrit=x1+(y1-y2)*(ux-x1)/(y1-uy):dx=SGN(x2-xcrit)*SGN(stpy) :ELSE dx=SGN(ux-x1)
- IF x1<>x2 THEN ycrit=y1-(ux-x1)*(y1-y2)/(x2-x1):dy=SGN(ycrit-uy)*SGN(stpx) :ELSE dy=SGN(y2-y1)
- afill:
- IF dy<0 THEN COLOR 1,2 :ELSE COLOR 3,2
- IF x<>xbeg AND y<>ybeg THEN AREA (x1,y1):AREA (x2,y2):AREA (lx,ly):AREA (ux,uy):AREAFILL
- grid:
- xlines:
- IF gtype=1 THEN ylines
- IF y<>ybeg THEN LINE (x1,y1)-(x2,y2),2:IF x<>xbeg THEN LINE (ux,uy)-(lx,ly),2
- ylines:
- IF gtype=2 THEN nexprep
- IF x<>xbeg THEN LINE (lx,ly)-(x2,y2),2:IF y<>ybeg THEN LINE (ux,uy)-(x1,y1),2
- nexprep:
- ux=lx:uy=ly
- x1=x2:y1=y2
- IF MENU(0)=4 THEN
- IF MENU(1)=2 THEN
- inq$="Stop Drawing"
- WINDOW OUTPUT 1
- GOSUB confirm
- WINDOW OUTPUT n
- IF an$="Y" THEN x=xend:y=yend:qflag=1
- END IF
- END IF
- NEXT:NEXT:IF qflag THEN setup
- pause:
- WINDOW OUTPUT 1
- LOCATE 22,26:COLOR 2,1
- PRINT" Press any key to continue. "
- a$=INKEY$
- waitloop:
- a$=INKEY$
- IF a$="" THEN waitloop
- endraw:
- GOTO setup
- figcolor:
- GOSUB ghostmenu
- red=r(id):green=g(id):blue=b(id)
- GOSUB changecolor
- LINE (155,15)-(255,75),3,bf
- LINE (350,15)-(450,75),1,bf
- LINE (205,15)-(205,75),2:LINE (155,45)-(255,45),2
- LINE (400,15)-(400,75),2:LINE (350,45)-(450,45),2
- LOCATE 11,25:PRINT"TOP":LOCATE 11,48:PRINT"BOTTOM"
- LINE (50,103)-(550,113),1,b
- LINE (98,104)-STEP(450,8),0,bf
- LOCATE 14,8:PRINT "red"
- LINE (50,119)-(550,129),1,b
- LINE (98,120)-STEP(450,8),0,bf
- LOCATE 16,8:PRINT "green"
- LINE (50,135)-(550,145),1,b
- LINE (98,136)-STEP(450,8),0,bf
- LOCATE 18,8:PRINT "blue"
- LINE (155,153)-(255,173),1,b
- PAINT (200,163),0,1:LOCATE 21,24:PRINT "RESET"
- LINE (350,153)-(455,173),1,b
- PAINT (400,163),0,1:LOCATE 21,49:PRINT "QUIT"
- colorbars:
- LINE (98,104)-STEP(red*452,8),1,bf
- LINE (98,120)-STEP(green*452,8),1,bf
- LINE (98,136)-STEP(blue*452,8),1,bf
- checkmouse:
- IF MOUSE(0)=0 THEN checkmouse
- x0=MOUSE(1):y0=MOUSE(2)
- IF (y0>153 AND y0<173) AND MOUSE(0)>-1 THEN
- IF x0>155 AND x0<255 THEN figcolor
- IF x0>350 AND x0<455 THEN
- r(id)=red:g(id)=green:b(id)=blue
- GOTO setup1
- END IF
- GOTO checkmouse
- END IF
- x=MOUSE(5):y=MOUSE(4):newcolor=(x-98)/(550-98)
- IF newcolor<0 OR newcolor>1 THEN checkmouse
- IF y>103 AND y<113 THEN
- red=newcolor:GOSUB changecolor
- LINE (98,104)-STEP(450,8),0,bf
- GOTO colorbars
- END IF
- IF y>119 AND y<129 THEN
- green=newcolor:GOSUB changecolor
- LINE (98,120)-STEP(450,8),0,bf
- GOTO colorbars
- END IF
- IF y>135 AND y<145 THEN
- blue=newcolor:GOSUB changecolor
- LINE (98,136)-STEP(450,8),0,bf
- GOTO colorbars
- END IF
- GOTO checkmouse
- changecolor:
- PALETTE id,red,green,blue
- RETURN
- ghostmenu:
- MENU 1,0,0:MENU 2,0,0:MENU 3,0,0:MENU 4,0,0
- RETURN
- checkends:
- IF (m1>m2) OR (m3>m4) THEN
- BEEP:status$=""
- IF m1>m2 THEN status$=status$+" xmin>xmax. "
- IF m3>m4 THEN status$=status$+" ymin>ymax. "
- ov%=34-LEN(status$)/2:LOCATE 22,ov%
- COLOR 2,1:PRINT status$+"Please fix. ":COLOR 1,0
- GOTO options
- END IF
- xstatus:
- COLOR 1,0:LOCATE 22,ov%:c=2*(34-ov%)+12
- FOR i=1 TO c:PRINT" ";:NEXT
- RETURN
- confirm:
- lin=CSRLIN
- row=POS(0)
- mv%=30-LEN(inq$)/2
- LOCATE 22,mv%:COLOR 2,1
- PRINT " "+inq$+" ";:COLOR 1,0
- PRINT " Are you sure (y/n)?"
- getakey:
- a$=INKEY$
- an$=UCASE$(a$)
- IF an$<>"Y" AND an$<>"N" THEN getakey
- LOCATE 22,mv%
- FOR i=1 TO 50
- PRINT " ";
- NEXT
- LOCATE lin,row
- RETURN
- mischeck:
- IF (ERR=5) OR (ERR=11) THEN RESUME NEXT
- IF (ERR=2) AND (ERL=100) THEN GOTO request
- ON ERROR GOTO 0
- request:
- CLS:BEEP:PRINT"Syntax error in equation."
- PRINT:PRINT"z=";f$
- eflag=1:RESUME NEXT
-