home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
plot
/
3dbas03.arc
/
3DPLOT.ASC
next >
Wrap
Text File
|
1989-08-01
|
11KB
|
241 lines
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