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

  1. 1 KEY OFF
  2. 2 CLS
  3. 3 GOTO 9773
  4. 4 REM      Lines 10 through 9772 are reserved for defining z=f(x,y).
  5. 5 REM
  6. 10 REM     This function plots a circular wave in three dimensions.
  7. 20 REM Try plotting -1 <= x <= 1 and -1 <= y <= 1 with 30 divisions
  8. 30 REM along each axis, a rotation of 30 degrees, and a tilt of 20
  9. 40 REM degrees.
  10. 50 T1=X*X+Y*Y
  11. 60 T2=COS(7!*SQR(T1))
  12. 70 Z=2*T2*T2/(1!+30!*T1)
  13. 80 RETURN
  14. 9773 MAX.Y.OUT%=639
  15. 9774 MAX.Z.OUT%=199
  16. 9775 PRINT "                             Three Dimensional Plot"
  17. 9776 PRINT
  18. 9777 PRINT
  19. 9778 PRINT
  20. 9779 PRINT "Smallest value for x";
  21. 9780 INPUT X.MIN
  22. 9781 PRINT "Largest value for x";
  23. 9782 INPUT X.MAX
  24. 9783 PRINT "Smallest value for y";
  25. 9784 INPUT Y.MIN
  26. 9785 PRINT "Largest value for y";
  27. 9786 INPUT Y.MAX
  28. 9787 PRINT "Number of divisions for x";
  29. 9788 INPUT NUM.X.DIVISIONS%
  30. 9789 IF NUM.X.DIVISIONS% > 1 THEN 9792
  31. 9790 PRINT "? there must be at least 2 divisions"
  32. 9791 GOTO 9787
  33. 9792 PRINT "Number of divisions for y";
  34. 9793 INPUT NUM.Y.DIVISIONS%
  35. 9794 IF NUM.Y.DIVISIONS% > 1 THEN 9797
  36. 9795 PRINT "? there must be at least 2 divisions"
  37. 9796 GOTO 9792
  38. 9797 DIM X.PRIME(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
  39. 9798 DIM Y.PRIME(NUM.X.DIVISIONS%,NUM.Y.DIVISIONS%)
  40. 9799 DIM Z.PRIME(NUM.X.DIVISIONS%,NUM.Y.DIVISIONS%)
  41. 9800 DIM X.DIVISION.INDEX%(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
  42. 9801 DIM Y.DIVISION.INDEX%(NUM.X.DIVISIONS%*NUM.Y.DIVISIONS%)
  43. 9802 DIM BOX.X%(4),BOX.Y%(4)
  44. 9803   PRINT "Rotation about the z-axis (degrees)";
  45. 9804   INPUT ROTATION
  46. 9805   PRINT "Tilt about the resulting y-axis (degrees)";
  47. 9806   INPUT TILT
  48. 9807   PRINT "After the plot is displayed, press a key to continue."
  49. 9808   PRINT "Evaluating function..."
  50. 9809   RADIANS.PER.DEGREE=ATN(1!)/45!
  51. 9810   RADIANS=TILT*RADIANS.PER.DEGREE
  52. 9811   COS.TILT=COS(RADIANS)
  53. 9812   SIN.TILT=SIN(RADIANS)
  54. 9813   RADIANS=ROTATION*RADIANS.PER.DEGREE
  55. 9814   COS.ROTATION=COS(RADIANS)
  56. 9815   SIN.ROTATION=SIN(RADIANS)
  57. 9816   X=X.MIN
  58. 9817   Y=Y.MIN
  59. 9818   GOSUB 10
  60. 9819   X.ROTATED=X.MIN*COS.ROTATION+Y.MIN*SIN.ROTATION
  61. 9820   Y.PRIME.MIN=-X.MIN*SIN.ROTATION+Y.MIN*COS.ROTATION
  62. 9821   Z.PRIME.MIN=-X.ROTATED*SIN.TILT+Z*COS.TILT
  63. 9822   Y.PRIME.MAX=Y.PRIME.MIN
  64. 9823   Z.PRIME.MAX=Z.PRIME.MIN
  65. 9824   X.PRIME.MAX=X.ROTATED*COS.TILT+Z*SIN.TILT
  66. 9825   DELTA.X=NUM.X.DIVISIONS%
  67. 9826   DELTA.X=(X.MAX-X.MIN)/DELTA.X
  68. 9827   DELTA.Y=NUM.Y.DIVISIONS%
  69. 9828   DELTA.Y=(Y.MAX-Y.MIN)/DELTA.Y
  70. 9829   X=X.MIN
  71. 9830   NUM.X.PRIMES%=0
  72. 9831   FOR X.DIVISION.NUM%=1 TO NUM.X.DIVISIONS%
  73. 9832     Y=Y.MIN
  74. 9833     FOR Y.DIVISION.NUM%=1 TO NUM.Y.DIVISIONS%
  75. 9834       GOSUB 10
  76. 9835       NUM.X.PRIMES%=NUM.X.PRIMES%+1
  77. 9836       X.DIVISION.INDEX%(NUM.X.PRIMES%)=X.DIVISION.NUM%
  78. 9837       Y.DIVISION.INDEX%(NUM.X.PRIMES%)=Y.DIVISION.NUM%
  79. 9838       X.ROTATED=X*COS.ROTATION+Y*SIN.ROTATION
  80. 9839       Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=-X*SIN.ROTATION+Y*COS.ROTATION
  81. 9840       X.PRIME(NUM.X.PRIMES%)=X.ROTATED*COS.TILT+Z*SIN.TILT
  82. 9841       Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=-X.ROTATED*SIN.TILT+Z*COS.TILT
  83. 9842       IF X.PRIME(NUM.X.PRIMES%) <= X.PRIME.MAX THEN 9844
  84. 9843         X.PRIME.MAX=X.PRIME(NUM.X.PRIMES%)
  85. 9844       IF Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) >= Y.PRIME.MIN THEN 9846
  86. 9845         Y.PRIME.MIN=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  87. 9846       IF Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) <= Y.PRIME.MAX THEN 9848
  88. 9847         Y.PRIME.MAX=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  89. 9848       IF Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) >= Z.PRIME.MIN THEN 9850
  90. 9849         Z.PRIME.MIN=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  91. 9850       IF Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%) <= Z.PRIME.MAX THEN 9852
  92. 9851         Z.PRIME.MAX=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  93. 9852       Y=Y+DELTA.Y
  94. 9853     NEXT Y.DIVISION.NUM%
  95. 9854     X=X+DELTA.X
  96. 9855   NEXT X.DIVISION.NUM%
  97. 9856   PRINT "Adjusting perspective..."
  98. 9857   IF Y.PRIME.MAX-Y.PRIME.MIN > Z.PRIME.MAX-Z.PRIME.MIN THEN 9861
  99. 9858   IF Z.PRIME.MAX = Z.PRIME.MIN THEN 9880
  100. 9859   X.EYE=2!*(Z.PRIME.MAX-Z.PRIME.MIN)+X.PRIME.MAX
  101. 9860   GOTO 9862
  102. 9861   X.EYE=2!*(Y.PRIME.MAX-Y.PRIME.MIN)+X.PRIME.MAX
  103. 9862   Y.CENTER=(Y.PRIME.MAX+Y.PRIME.MIN)/2!
  104. 9863   Z.CENTER=(Z.PRIME.MAX+Z.PRIME.MIN)/2!
  105. 9864   NUM.X.PRIMES%=0
  106. 9865   FOR X.DIVISION.NUM%=1 TO NUM.X.DIVISIONS%
  107. 9866     Y=Y.MIN
  108. 9867     FOR Y.DIVISION.NUM%=1 TO NUM.Y.DIVISIONS%
  109. 9868       NUM.X.PRIMES%=NUM.X.PRIMES%+1
  110. 9869       X=X.PRIME(NUM.X.PRIMES%)
  111. 9870       Y=Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  112. 9871       Z=Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)
  113. 9872       DELTA.X=X-X.EYE
  114. 9873       DELTA.Y=Y-Y.CENTER
  115. 9874       DELTA.Z=Z-Z.CENTER
  116. 9875       X.PRIME(NUM.X.PRIMES%)=SQR(DELTA.X*DELTA.X+DELTA.Y*DELTA.Y+DELTA.Z*DELTA.Z)
  117. 9876       Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=Y.CENTER+(Y-Y.CENTER)*(X.EYE-X.PRIME.MAX)/(X.EYE-X)
  118. 9877       Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)=Z.CENTER+(Z-Z.CENTER)*(X.EYE-X.PRIME.MAX)/(X.EYE-X)
  119. 9878     NEXT Y.DIVISION.NUM%
  120. 9879   NEXT X.DIVISION.NUM%
  121. 9880   PRINT "Sorting points..."
  122. 9881   SORT.LEFT%=NUM.X.PRIMES%\2
  123. 9882   SORT.LEFT%=SORT.LEFT%+1
  124. 9883   SORT.RIGHT%=NUM.X.PRIMES%
  125. 9884   SORT.T1=X.PRIME(1)
  126. 9885   SORT.T2%=X.DIVISION.INDEX%(1)
  127. 9886   SORT.T3%=Y.DIVISION.INDEX%(1)
  128. 9887   IF SORT.RIGHT% <= 1 THEN 9918
  129. 9888     IF SORT.LEFT% <= 1 THEN 9894
  130. 9889       SORT.LEFT%=SORT.LEFT%-1
  131. 9890       SORT.T1=X.PRIME(SORT.LEFT%)
  132. 9891       SORT.T2%=X.DIVISION.INDEX%(SORT.LEFT%)
  133. 9892       SORT.T3%=Y.DIVISION.INDEX%(SORT.LEFT%)
  134. 9893     GOTO 9901
  135. 9894       SORT.T1=X.PRIME(SORT.RIGHT%)
  136. 9895       SORT.T2%=X.DIVISION.INDEX%(SORT.RIGHT%)
  137. 9896       SORT.T3%=Y.DIVISION.INDEX%(SORT.RIGHT%)
  138. 9897       X.PRIME(SORT.RIGHT%)=X.PRIME(1)
  139. 9898       X.DIVISION.INDEX%(SORT.RIGHT%)=X.DIVISION.INDEX%(1)
  140. 9899       Y.DIVISION.INDEX%(SORT.RIGHT%)=Y.DIVISION.INDEX%(1)
  141. 9900       SORT.RIGHT%=SORT.RIGHT%-1
  142. 9901     IF SORT.RIGHT% <= 1 THEN 9918
  143. 9902     KEY.INDEX.2%=SORT.LEFT%
  144. 9903     KEY.INDEX.1%=KEY.INDEX.2%
  145. 9904       KEY.INDEX.2%=2*KEY.INDEX.2%
  146. 9905       IF KEY.INDEX.2% > SORT.RIGHT% THEN 9914
  147. 9906         IF KEY.INDEX.2% = SORT.RIGHT% THEN 9909
  148. 9907           IF X.PRIME(KEY.INDEX.2%) <= X.PRIME(KEY.INDEX.2%+1) THEN 9909
  149. 9908             KEY.INDEX.2%=KEY.INDEX.2%+1
  150. 9909         IF SORT.T1 <= X.PRIME(KEY.INDEX.2%) THEN 9914
  151. 9910           X.PRIME(KEY.INDEX.1%)=X.PRIME(KEY.INDEX.2%)
  152. 9911           X.DIVISION.INDEX%(KEY.INDEX.1%)=X.DIVISION.INDEX%(KEY.INDEX.2%)
  153. 9912           Y.DIVISION.INDEX%(KEY.INDEX.1%)=Y.DIVISION.INDEX%(KEY.INDEX.2%)
  154. 9913     GOTO 9903
  155. 9914     X.PRIME(KEY.INDEX.1%)=SORT.T1
  156. 9915     X.DIVISION.INDEX%(KEY.INDEX.1%)=SORT.T2%
  157. 9916     Y.DIVISION.INDEX%(KEY.INDEX.1%)=SORT.T3%
  158. 9917   GOTO 9887
  159. 9918   X.PRIME(1)=SORT.T1
  160. 9919   X.DIVISION.INDEX%(1)=SORT.T2%
  161. 9920   Y.DIVISION.INDEX%(1)=SORT.T3%
  162. 9921   SCREEN 2
  163. 9922   ASPECT.RATIO=1!/(4!*(200!/640!)/3!)
  164. 9923   Y.OUT.MAX=MAX.Y.OUT%
  165. 9924   Z.OUT.MAX=MAX.Z.OUT%
  166. 9925   IF ASPECT.RATIO*Z.OUT.MAX*(Y.PRIME.MAX-Y.PRIME.MIN) <= Y.OUT.MAX*(Z.PRIME.MAX-Z.PRIME.MIN) THEN 9930
  167. 9926     PIXELS.PER.UNIT=Y.OUT.MAX/(ASPECT.RATIO*(Y.PRIME.MAX-Y.PRIME.MIN))
  168. 9927     Y.OFFSET=0!
  169. 9928     Z.OFFSET=-(Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME.MAX-Z.PRIME.MIN))/2!
  170. 9929   GOTO 9938
  171. 9930     IF ASPECT.RATIO*Z.OUT.MAX*(Y.PRIME.MAX-Y.PRIME.MIN) >= Y.OUT.MAX*(Z.PRIME.MAX-Z.PRIME.MIN) THEN 9935
  172. 9931       PIXELS.PER.UNIT=Z.OUT.MAX/(Z.PRIME.MAX-Z.PRIME.MIN)
  173. 9932       Y.OFFSET=(Y.OUT.MAX-ASPECT.RATIO*PIXELS.PER.UNIT*(Y.PRIME.MAX-Y.PRIME.MIN))/2!
  174. 9933       Z.OFFSET=0!
  175. 9934     GOTO 9938
  176. 9935       PIXELS.PER.UNIT=1!
  177. 9936       Y.OFFSET=Y.OUT.MAX/2!
  178. 9937       Z.OFFSET=-Z.OUT.MAX/2!
  179. 9938   FOR X.PRIME.NUM%=1 TO NUM.X.PRIMES%
  180. 9939     X.DIVISION.NUM%=X.DIVISION.INDEX%(X.PRIME.NUM%)
  181. 9940     IF X.DIVISION.NUM% = NUM.X.DIVISIONS% THEN 9985
  182. 9941       Y.DIVISION.NUM%=Y.DIVISION.INDEX%(X.PRIME.NUM%)
  183. 9942       IF Y.DIVISION.NUM% = NUM.Y.DIVISIONS% THEN 9985
  184. 9943         BOX.X%(1)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)-Y.PRIME.MIN))
  185. 9944         BOX.Y%(1)=FIX(Z.OFFSET+Z.OUT.MAX-PIXELS.PER.UNIT*(Z.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%)-Z.PRIME.MIN))
  186. 9945         BOX.X%(2)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%+1,Y.DIVISION.NUM%)-Y.PRIME.MIN))
  187. 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))
  188. 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))
  189. 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))
  190. 9949         BOX.X%(4)=FIX(Y.OFFSET+PIXELS.PER.UNIT*ASPECT.RATIO*(Y.PRIME(X.DIVISION.NUM%,Y.DIVISION.NUM%+1)-Y.PRIME.MIN))
  191. 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))
  192. 9951         BOX.Y.MIN%=BOX.Y%(1)
  193. 9952         BOX.Y.MAX%=BOX.Y.MIN%
  194. 9953         FOR BOX.NUM.1%=2 TO 4
  195. 9954           IF BOX.Y%(BOX.NUM.1%) < BOX.Y.MIN% THEN BOX.Y.MIN%=BOX.Y%(BOX.NUM.1%)
  196. 9955           IF BOX.Y%(BOX.NUM.1%) > BOX.Y.MAX% THEN BOX.Y.MAX%=BOX.Y%(BOX.NUM.1%)
  197. 9956         NEXT BOX.NUM.1%
  198. 9957         FOR BOX.Y1%=BOX.Y.MIN% TO BOX.Y.MAX%
  199. 9958           INTERCEPT.COUNT.MOD.2%=0
  200. 9959           BOX.NUM.2%=2
  201. 9960           FOR BOX.NUM.1%=1 TO 4
  202. 9961             IF BOX.Y%(BOX.NUM.1%) >= BOX.Y1% THEN 9974
  203. 9962               IF BOX.Y1% > BOX.Y%(BOX.NUM.2%) THEN 9975
  204. 9963                 BOX.DELTA.Y=BOX.Y%(BOX.NUM.2%)-BOX.Y%(BOX.NUM.1%)
  205. 9964                 BOX.DELTA.X=BOX.X%(BOX.NUM.2%)-BOX.X%(BOX.NUM.1%)
  206. 9965                 BOX.Y.OFFSET=BOX.Y1%-BOX.Y%(BOX.NUM.1%)
  207. 9966                 BOX.X.INTERCEPT=BOX.X%(BOX.NUM.1%)
  208. 9967                 BOX.X1%=FIX(BOX.DELTA.X*BOX.Y.OFFSET/BOX.DELTA.Y+BOX.X.INTERCEPT)
  209. 9968                 IF INTERCEPT.COUNT.MOD.2% = 0 THEN 9971
  210. 9969                   LINE (BOX.X1%,BOX.Y1%)-(BOX.X2%,BOX.Y1%),0
  211. 9970                 GOTO 9972
  212. 9971                   BOX.X2%=BOX.X1%
  213. 9972                 INTERCEPT.COUNT.MOD.2%=1-INTERCEPT.COUNT.MOD.2%
  214. 9973               GOTO 9975
  215. 9974             IF BOX.Y1% > BOX.Y%(BOX.NUM.2%) THEN 9963
  216. 9975             BOX.NUM.2%=BOX.NUM.2%+1
  217. 9976             IF BOX.NUM.2% > 4 THEN BOX.NUM.2%=1
  218. 9977           NEXT BOX.NUM.1%
  219. 9978         NEXT BOX.Y1%
  220. 9979         BOX.NUM.2%=2
  221. 9980         FOR BOX.NUM.1%=1 TO 4
  222. 9981           LINE (BOX.X%(BOX.NUM.1%),BOX.Y%(BOX.NUM.1%))-(BOX.X%(BOX.NUM.2%),BOX.Y%(BOX.NUM.2%))
  223. 9982           BOX.NUM.2%=BOX.NUM.2%+1
  224. 9983           IF BOX.NUM.2% > 4 THEN BOX.NUM.2%=1
  225. 9984         NEXT BOX.NUM.1%
  226. 9985   NEXT X.PRIME.NUM%
  227. 9986   RESPONSE$=INKEY$
  228. 9987   IF LEN(RESPONSE$) = 0 THEN 9986
  229. 9988   SCREEN 0
  230. 9989   WIDTH 80
  231. 9990   PRINT "                             Three Dimensional Plot"
  232. 9991   PRINT
  233. 9992   PRINT
  234. 9993   PRINT
  235. 9994   PRINT "Again (y or n)? ";
  236. 9995   RESPONSE$=INKEY$
  237. 9996   IF LEN(RESPONSE$) = 0 THEN 9995
  238. 9997   PRINT
  239. 9998   IF ((RESPONSE$ = "Y") OR (RESPONSE$ = "y")) THEN 9803
  240. 9999 END
  241.