home *** CD-ROM | disk | FTP | other *** search
- 1 KEY OFF
- 2 CLS
- 3 GOTO 9773
- 4 REM Lines 10 through 9772 are reserved for defining z=f(x,y).
- 5 REM
- 10 REM This function plots a circular wave in three dimensions.
- 20 REM Try plotting -1 <= x <= 1 and -1 <= y <= 1 with 30 divisions
- 30 REM along each axis, a rotation of 30 degrees, and a tilt of 20
- 40 REM degrees.
- 50 T1=X*X+Y*Y
- 60 T2=COS(7!*SQR(T1))
- 70 Z=2*T2*T2/(1!+30!*T1)
- 80 RETURN
- 9773 MAX.Y.OUT%=639
- 9774 MAX.Z.OUT%=199
- 9775 PRINT " Three Dimensional Plot"
- 9776 PRINT
- 9777 PRINT
- 9778 PRINT
- 9779 PRINT "Smallest value for x";
- 9780 INPUT X.MIN
- 9781 PRINT "Largest value for x";
- 9782 INPUT X.MAX
- 9783 PRINT "Smallest value for y";
- 9784 INPUT Y.MIN
- 9785 PRINT "Largest value for y";
- 9786 INPUT Y.MAX
- 9787 PRINT "Number of divisions for x";
- 9788 INPUT NUM.X.DIVISIONS%
- 9789 IF NUM.X.DIVISIONS% > 1 THEN 9792
- 9790 PRINT "? there must be at least 2 divisions"
- 9791 GOTO 9787
- 9792 PRINT "Number of divisions for y";
- 9793 INPUT NUM.Y.DIVISIONS%
- 9794 IF NUM.Y.DIVISIONS% > 1 THEN 9797
- 9795 PRINT "? there must be at least 2 divisions"
- 9796 GOTO 9792
- 9797 DIM X.PRIME(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
- 9798 DIM Y.PRIME(NUM.X.DIVISIONS%,NUM.Y.DIVISIONS%)
- 9799 DIM Z.PRIME(NUM.X.DIVISIONS%,NUM.Y.DIVISIONS%)
- 9800 DIM X.DIVISION.INDEX%(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
- 9801 DIM Y.DIVISION.INDEX%(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
- 9802 DIM BOX.X%(4),BOX.Y%(4)
- 9803 PRINT "Rotation about the z-axis (degrees)";
- 9804 INPUT ROTATION
- 9805 PRINT "Tilt about the resulting y-axis (degrees)";
- 9806 INPUT TILT
- 9807 PRINT "After the plot is displayed, press a key to continue."
- 9808 PRINT "Evaluating function..."
- 9809 RADIANS.PER.DEGREE=ATN(1!)/45!
- 9810 RADIANS=TILT*RADIANS.PER.DEGREE
- 9811 COS.TILT=COS(RADIANS)
- 9812 SIN.TILT=SIN(RADIANS)
- 9813 RADIANS=ROTATION*RADIANS.PER.DEGREE
- 9814 COS.ROTATION=COS(RADIANS)
- 9815 SIN.ROTATION=SIN(RADIANS)
- 9816 X=X.MIN
- 9817 Y=Y.MIN
- 9818 GOSUB 10
- 9819 X.ROTATED=X.MIN*COS.ROTATION+Y.MIN*SIN.ROTATION
- 9820 Y.PRIME.MIN=-X.MIN*SIN.ROTATION+Y.MIN*COS.ROTATION
- 9821 Z.PRIME.MIN=-X.ROTATED*SIN.TILT+Z*COS.TILT
- 9822 Y.PRIME.MAX=Y.PRIME.MIN
- 9823 Z.PRIME.MAX=Z.PRIME.MIN
- 9824 X.PRIME.MAX=X.ROTATED*COS.TILT+Z*SIN.TILT
- 9825 DELTA.X=NUM.X.DIVISIONS%
- 9826 DELTA.X=(X.MAX-X.MIN)/DELTA.X
- 9827 DELTA.Y=NUM.Y.DIVISIONS%
- 9828 DELTA.Y=(Y.MAX-Y.MIN)/DELTA.Y
- 9829 X=X.MIN
- 9830 NUM.X.PRIMES%=0
- 9831 FOR X.DIVISION.NUM%=1 TO NUM.X.DIVISIONS%
- 9832 Y=Y.MIN
- 9833 FOR Y.DIVISION.NUM%=1 TO NUM.Y.DIVISIONS%
- 9834 GOSUB 10
- 9835 NUM.X.PRIMES%=NUM.X.PRIMES%+1
- 9836 X.DIVISION.INDEX%(NUM.X.PRIMES%)=X.DIVISION.NUM%
- 9837 Y.DIVISION.INDEX%(NUM.X.PRIMES%)=Y.DIVISION.NUM%
- 9838 X.ROTATED=X*COS.ROTATION+Y*SIN.ROTATION
- 9839 Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=-X*SIN.ROTATION+Y*COS.ROTATION
- 9840 X.PRIME(NUM.X.PRIMES%)=X.ROTATED*COS.TILT+Z*SIN.TILT
- 9841 Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=-X.ROTATED*SIN.TILT+Z*COS.TILT
- 9842 IF X.PRIME(NUM.X.PRIMES%) <= X.PRIME.MAX THEN 9844
- 9843 X.PRIME.MAX=X.PRIME(NUM.X.PRIMES%)
- 9844 IF Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) >= Y.PRIME.MIN THEN 9846
- 9845 Y.PRIME.MIN=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9846 IF Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) <= Y.PRIME.MAX THEN 9848
- 9847 Y.PRIME.MAX=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9848 IF Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) >= Z.PRIME.MIN THEN 9850
- 9849 Z.PRIME.MIN=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9850 IF Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) <= Z.PRIME.MAX THEN 9852
- 9851 Z.PRIME.MAX=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9852 Y=Y+DELTA.Y
- 9853 NEXT Y.DIVISION.NUM%
- 9854 X=X+DELTA.X
- 9855 NEXT X.DIVISION.NUM%
- 9856 PRINT "Adjusting perspective..."
- 9857 IF Y.PRIME.MAX-Y.PRIME.MIN > Z.PRIME.MAX-Z.PRIME.MIN THEN 9861
- 9858 IF Z.PRIME.MAX = Z.PRIME.MIN THEN 9880
- 9859 X.EYE=2!*(Z.PRIME.MAX-Z.PRIME.MIN)+X.PRIME.MAX
- 9860 GOTO 9862
- 9861 X.EYE=2!*(Y.PRIME.MAX-Y.PRIME.MIN)+X.PRIME.MAX
- 9862 Y.CENTER=(Y.PRIME.MAX+Y.PRIME.MIN)/2!
- 9863 Z.CENTER=(Z.PRIME.MAX+Z.PRIME.MIN)/2!
- 9864 NUM.X.PRIMES%=0
- 9865 FOR X.DIVISION.NUM%=1 TO NUM.X.DIVISIONS%
- 9866 Y=Y.MIN
- 9867 FOR Y.DIVISION.NUM%=1 TO NUM.Y.DIVISIONS%
- 9868 NUM.X.PRIMES%=NUM.X.PRIMES%+1
- 9869 X=X.PRIME(NUM.X.PRIMES%)
- 9870 Y=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9871 Z=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
- 9872 DELTA.X=X-X.EYE
- 9873 DELTA.Y=Y-Y.CENTER
- 9874 DELTA.Z=Z-Z.CENTER
- 9875 X.PRIME(NUM.X.PRIMES%)=SQR(DELTA.X*DELTA.X+DELTA.Y*DELTA.Y+DELTA.Z*DELTA.Z)
- 9876 Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=Y.CENTER+(Y-Y.CENTER)*(X.EYE-X.PRIME.MAX)/(X.EYE-X)
- 9877 Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=Z.CENTER+(Z-Z.CENTER)*(X.EYE-X.PRIME.MAX)/(X.EYE-X)
- 9878 NEXT Y.DIVISION.NUM%
- 9879 NEXT X.DIVISION.NUM%
- 9880 PRINT "Sorting points..."
- 9881 SORT.LEFT%=NUM.X.PRIMES%\2
- 9882 SORT.LEFT%=SORT.LEFT%+1
- 9883 SORT.RIGHT%=NUM.X.PRIMES%
- 9884 SORT.T1=X.PRIME(1)
- 9885 SORT.T2%=X.DIVISION.INDEX%(1)
- 9886 SORT.T3%=Y.DIVISION.INDEX%(1)
- 9887 IF SORT.RIGHT% <= 1 THEN 9918
- 9888 IF SORT.LEFT% <= 1 THEN 9894
- 9889 SORT.LEFT%=SORT.LEFT%-1
- 9890 SORT.T1=X.PRIME(SORT.LEFT%)
- 9891 SORT.T2%=X.DIVISION.INDEX%(SORT.LEFT%)
- 9892 SORT.T3%=Y.DIVISION.INDEX%(SORT.LEFT%)
- 9893 GOTO 9901
- 9894 SORT.T1=X.PRIME(SORT.RIGHT%)
- 9895 SORT.T2%=X.DIVISION.INDEX%(SORT.RIGHT%)
- 9896 SORT.T3%=Y.DIVISION.INDEX%(SORT.RIGHT%)
- 9897 X.PRIME(SORT.RIGHT%)=X.PRIME(1)
- 9898 X.DIVISION.INDEX%(SORT.RIGHT%)=X.DIVISION.INDEX%(1)
- 9899 Y.DIVISION.INDEX%(SORT.RIGHT%)=Y.DIVISION.INDEX%(1)
- 9900 SORT.RIGHT%=SORT.RIGHT%-1
- 9901 IF SORT.RIGHT% <= 1 THEN 9918
- 9902 KEY.INDEX.2%=SORT.LEFT%
- 9903 KEY.INDEX.1%=KEY.INDEX.2%
- 9904 KEY.INDEX.2%=2*KEY.INDEX.2%
- 9905 IF KEY.INDEX.2% > SORT.RIGHT% THEN 9914
- 9906 IF KEY.INDEX.2% = SORT.RIGHT% THEN 9909
- 9907 IF X.PRIME(KEY.INDEX.2%) <= X.PRIME(KEY.INDEX.2%+1) THEN 9909
- 9908 KEY.INDEX.2%=KEY.INDEX.2%+1
- 9909 IF SORT.T1 <= X.PRIME(KEY.INDEX.2%) THEN 9914
- 9910 X.PRIME(KEY.INDEX.1%)=X.PRIME(KEY.INDEX.2%)
- 9911 X.DIVISION.INDEX%(KEY.INDEX.1%)=X.DIVISION.INDEX%(KEY.INDEX.2%)
- 9912 Y.DIVISION.INDEX%(KEY.INDEX.1%)=Y.DIVISION.INDEX%(KEY.INDEX.2%)
- 9913 GOTO 9903
- 9914 X.PRIME(KEY.INDEX.1%)=SORT.T1
- 9915 X.DIVISION.INDEX%(KEY.INDEX.1%)=SORT.T2%
- 9916 Y.DIVISION.INDEX%(KEY.INDEX.1%)=SORT.T3%
- 9917 GOTO 9887
- 9918 X.PRIME(1)=SORT.T1
- 9919 X.DIVISION.INDEX%(1)=SORT.T2%
- 9920 Y.DIVISION.INDEX%(1)=SORT.T3%
- 9921 SCREEN 2
- 9922 ASPECT.RATIO=1!/(4!*(200!/640!)/3!)
- 9923 Y.OUT.MAX=MAX.Y.OUT%
- 9924 Z.OUT.MAX=MAX.Z.OUT%
- 9925 IF ASPECT.RATIO*Z.OUT.MAX*(Y.PRIME.MAX-Y.PRIME.MIN) <= Y.OUT.MAX*(Z.PRIME.MAX-Z.PRIME.MIN) THEN 9930
- 9926 PIXELS.PER.UNIT=Y.OUT.MAX/(ASPECT.RATIO*(Y.PRIME.MAX-Y.PRIME.MIN))
- 9927 Y.OFFSET=0!
- 9928 Z.OFFSET=-(Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME.MAX-Z.PRIME.MIN))/2!
- 9929 GOTO 9938
- 9930 IF ASPECT.RATIO*Z.OUT.MAX*(Y.PRIME.MAX-Y.PRIME.MIN) >= Y.OUT.MAX*(Z.PRIME.MAX-Z.PRIME.MIN) THEN 9935
- 9931 PIXELS.PER.UNIT=Z.OUT.MAX/(Z.PRIME.MAX-Z.PRIME.MIN)
- 9932 Y.OFFSET=(Y.OUT.MAX-ASPECT.RATIO*PIXELS.PER.UNIT*(Y.PRIME.MAX-Y.PRIME.MIN))/2!
- 9933 Z.OFFSET=0!
- 9934 GOTO 9938
- 9935 PIXELS.PER.UNIT=1!
- 9936 Y.OFFSET=Y.OUT.MAX/2!
- 9937 Z.OFFSET=-Z.OUT.MAX/2!
- 9938 FOR X.PRIME.NUM%=1 TO NUM.X.PRIMES%
- 9939 X.DIVISION.NUM%=X.DIVISION.INDEX%(X.PRIME.NUM%)
- 9940 IF X.DIVISION.NUM% = NUM.X.DIVISIONS% THEN 9985
- 9941 Y.DIVISION.NUM%=Y.DIVISION.INDEX%(X.PRIME.NUM%)
- 9942 IF Y.DIVISION.NUM% = NUM.Y.DIVISIONS% THEN 9985
- 9943 BOX.X%(1)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)-Y.PRIME.MIN))
- 9944 BOX.Y%(1)=FIX(Z.OFFSET+Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)-Z.PRIME.MIN))
- 9945 BOX.X%(2)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%+1,Y.DIVISION.NUM%)-Y.PRIME.MIN))
- 9946 BOX.Y%(2)=FIX(Z.OFFSET+Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME(X.DIVISION.NUM%+1,Y.DIVISION.NUM%)-Z.PRIME.MIN))
- 9947 BOX.X%(3)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%+1,Y.DIVISION.NUM%+1)-Y.PRIME.MIN))
- 9948 BOX.Y%(3)=FIX(Z.OFFSET+Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME(X.DIVISION.NUM%+1,Y.DIVISION.NUM%+1)-Z.PRIME.MIN))
- 9949 BOX.X%(4)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%+1)-Y.PRIME.MIN))
- 9950 BOX.Y%(4)=FIX(Z.OFFSET+Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%+1)-Z.PRIME.MIN))
- 9951 BOX.Y.MIN%=BOX.Y%(1)
- 9952 BOX.Y.MAX%=BOX.Y.MIN%
- 9953 FOR BOX.NUM.1%=2 TO 4
- 9954 IF BOX.Y%(BOX.NUM.1%) < BOX.Y.MIN% THEN BOX.Y.MIN%=BOX.Y%(BOX.NUM.1%)
- 9955 IF BOX.Y%(BOX.NUM.1%) > BOX.Y.MAX% THEN BOX.Y.MAX%=BOX.Y%(BOX.NUM.1%)
- 9956 NEXT BOX.NUM.1%
- 9957 FOR BOX.Y1%=BOX.Y.MIN% TO BOX.Y.MAX%
- 9958 INTERCEPT.COUNT.MOD.2%=0
- 9959 BOX.NUM.2%=2
- 9960 FOR BOX.NUM.1%=1 TO 4
- 9961 IF BOX.Y%(BOX.NUM.1%) >= BOX.Y1% THEN 9974
- 9962 IF BOX.Y1% > BOX.Y%(BOX.NUM.2%) THEN 9975
- 9963 BOX.DELTA.Y=BOX.Y%(BOX.NUM.2%)-BOX.Y%(BOX.NUM.1%)
- 9964 BOX.DELTA.X=BOX.X%(BOX.NUM.2%)-BOX.X%(BOX.NUM.1%)
- 9965 BOX.Y.OFFSET=BOX.Y1%-BOX.Y%(BOX.NUM.1%)
- 9966 BOX.X.INTERCEPT=BOX.X%(BOX.NUM.1%)
- 9967 BOX.X1%=FIX(BOX.DELTA.X*BOX.Y.OFFSET/BOX.DELTA.Y+BOX.X.INTERCEPT)
- 9968 IF INTERCEPT.COUNT.MOD.2% = 0 THEN 9971
- 9969 LINE (BOX.X1%,BOX.Y1%)-(BOX.X2%,BOX.Y1%),0
- 9970 GOTO 9972
- 9971 BOX.X2%=BOX.X1%
- 9972 INTERCEPT.COUNT.MOD.2%=1-INTERCEPT.COUNT.MOD.2%
- 9973 GOTO 9975
- 9974 IF BOX.Y1% > BOX.Y%(BOX.NUM.2%) THEN 9963
- 9975 BOX.NUM.2%=BOX.NUM.2%+1
- 9976 IF BOX.NUM.2% > 4 THEN BOX.NUM.2%=1
- 9977 NEXT BOX.NUM.1%
- 9978 NEXT BOX.Y1%
- 9979 BOX.NUM.2%=2
- 9980 FOR BOX.NUM.1%=1 TO 4
- 9981 LINE (BOX.X%(BOX.NUM.1%),BOX.Y%(BOX.NUM.1%))-(BOX.X%(BOX.NUM.2%),BOX.Y%(BOX.NUM.2%))
- 9982 BOX.NUM.2%=BOX.NUM.2%+1
- 9983 IF BOX.NUM.2% > 4 THEN BOX.NUM.2%=1
- 9984 NEXT BOX.NUM.1%
- 9985 NEXT X.PRIME.NUM%
- 9986 RESPONSE$=INKEY$
- 9987 IF LEN(RESPONSE$) = 0 THEN 9986
- 9988 SCREEN 0
- 9989 WIDTH 80
- 9990 PRINT " Three Dimensional Plot"
- 9991 PRINT
- 9992 PRINT
- 9993 PRINT
- 9994 PRINT "Again (y or n)? ";
- 9995 RESPONSE$=INKEY$
- 9996 IF LEN(RESPONSE$) = 0 THEN 9995
- 9997 PRINT
- 9998 IF ((RESPONSE$ = "Y") OR (RESPONSE$ = "y")) THEN 9803
- 9999 END