home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / graph-3d.zip / GRAPHVGA.BAS < prev    next >
Encoding:
BASIC Source File  |  1990-08-08  |  15.8 KB  |  429 lines

  1. 10 DIM A(32),Y(64),Z(64):SCREEN 12
  2. 20 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=5
  3. 30 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd> 64 THEN DD=32
  4. 40 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  5. 50 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 or a>360 THEN A=70
  6. 60 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  7. 70 FOR I=-4*DD TO 0
  8. 80 MAX=-200:MIN=200:X=I/DD:X1=INT(70*X+.5)
  9. 90 NL=INT(SQR(16-X*X)*LD)
  10. 100 FOR K=-NL TO 0
  11. 110 Y=K/LD
  12. 120 GOSUB 230
  13. 130 A(-K)=Z
  14. 140 GOSUB 260
  15. 150 NEXT K
  16. 160 GOSUB 350
  17. 170 NEXT I
  18. 180 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  19. 190 IF INKEY$="" THEN 180
  20. 200 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  21. 210 A$=INKEY$:IF A$="R" OR A$="r" THEN 20 ELSE IF A$="N" OR A$="n" THEN 410 ELSE IF A$<>"E" AND A$<>"e" THEN 210
  22. 220 GOTO 4280
  23. 230 R=SQR(X*X+Y*Y)
  24. 240 Z=COS(4*R)/(R/2+2)-3*R/8+1
  25. 250 RETURN
  26. 260 Y=INT(70*(C*Y+S*Z)+.5)
  27. 270 IF M=4 THEN 310
  28. 280 IF Y<MIN THEN MIN=Y ELSE 310
  29. 290 PSET(320+X1,175-Y),14
  30. 300 PSET(320-X1,175-Y),14
  31. 310 IF Y>MAX THEN MAX=Y ELSE RETURN
  32. 320 PSET(320+X1,175-Y)
  33. 330 PSET(320-X1,175-Y)
  34. 340 RETURN
  35. 350 FOR K=0 TO NL
  36. 360 Z=A(K)
  37. 370 Y=K/LD
  38. 380 GOSUB 260
  39. 390 NEXT K
  40. 400 RETURN
  41. 410 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=3
  42. 420 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd.64 THEN DD=32
  43. 430 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  44. 440 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 or a>360 THEN A=75
  45. 450 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  46. 460 FOR I=-4*DD TO 0
  47. 470 MAX=-100:MIN=100:X=I/DD:X1=INT(70*X+.5)
  48. 480 NL=INT(SQR(16-X*X)*LD)
  49. 490 FOR K=-NL TO 0
  50. 500 Y=K/LD
  51. 510 GOSUB 620
  52. 520 A(-K)=Z
  53. 530 GOSUB 650
  54. 540 NEXT K
  55. 550 GOSUB 740
  56. 560 NEXT I
  57. 570 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  58. 580 IF INKEY$="" THEN 570
  59. 590 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  60. 600 A$=INKEY$:IF A$="R" OR A$="r" THEN 410 ELSE IF A$="N" OR A$="n" THEN 800 ELSE IF A$<>"E" AND A$<>"e" THEN 600
  61. 610 GOTO 4280
  62. 620 R=.75*SQR(X*X+Y*Y)
  63. 630 Z=1+COS(R)-COS(2*R)/2
  64. 640 RETURN
  65. 650 Y=INT(60*(C*Y+S*Z)+.5)
  66. 660 IF M=4 THEN 700
  67. 670 IF Y<MIN THEN MIN=Y ELSE 700
  68. 680 PSET(320+X1,175-Y),14
  69. 690 PSET(320-X1,175-Y),14
  70. 700 IF Y>MAX THEN MAX=Y ELSE RETURN
  71. 710 PSET(320+X1,175-Y)
  72. 720 PSET(320-X1,175-Y)
  73. 730 RETURN
  74. 740 FOR K=0 TO NL
  75. 750 Z=A(K)
  76. 760 Y=K/LD
  77. 770 GOSUB 650
  78. 780 NEXT K
  79. 790 RETURN
  80. 800 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=8
  81. 810 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd> 64 THEN DD=32
  82. 820 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  83. 830 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 or a>360 THEN A=70
  84. 840 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  85. 850 FOR I=-4*DD TO 0
  86. 860 MAX=-200:MIN=200:X=I/DD:X1=INT(65*X+.5)
  87. 870 NL=INT(SQR(16-X*X)*LD)
  88. 880 FOR K=-NL TO 0
  89. 890 Y=K/LD
  90. 900 GOSUB 1010
  91. 910 A(-K)=Z
  92. 920 GOSUB 1040
  93. 930 NEXT K
  94. 940 GOSUB 1120
  95. 950 NEXT I
  96. 960 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  97. 970 IF INKEY$="" THEN 960
  98. 980 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  99. 990 A$=INKEY$:IF A$="R" OR A$="r" THEN 800 ELSE IF A$="N" OR A$="n" THEN 1180 ELSE IF A$<>"E" AND A$<>"e" THEN 990
  100. 1000 GOTO 4280
  101. 1010 R=1.25*SQR(X*X+Y*Y)
  102. 1020 Z=1.75*(COS(R)+.4*COS(3*R))+.25
  103. 1030 RETURN
  104. 1040 Y=INT(55*(C*Y+S*Z)+.5)
  105. 1050 IF Y<MIN THEN MIN=Y ELSE 1080
  106. 1060 PSET(320+X1,175-Y),14
  107. 1070 PSET(320-X1,175-Y),14
  108. 1080 IF Y>MAX THEN MAX=Y ELSE RETURN
  109. 1090 PSET(320+X1,175-Y)
  110. 1100 PSET(320-X1,175-Y)
  111. 1110 RETURN
  112. 1120 FOR K=0 TO NL
  113. 1130 Z=A(K)
  114. 1140 Y=K/LD
  115. 1150 GOSUB 1040
  116. 1160 NEXT K
  117. 1170 RETURN
  118. 1180 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=4
  119. 1190 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  120. 1200 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  121. 1210 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 or a>360 THEN A=75
  122. 1220 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  123. 1230 FOR I=-4*DD TO 0
  124. 1240 MAX=-100:MIN=100:X=I/DD:X1=INT(70*X+.5)
  125. 1250 NL=INT(SQR(16-X*X)*LD)
  126. 1260 FOR K=-NL TO 0
  127. 1270 Y=K/LD
  128. 1280 GOSUB 1390
  129. 1290 A(-K)=Z
  130. 1300 GOSUB 1420
  131. 1310 NEXT K
  132. 1320 GOSUB 1500
  133. 1330 NEXT I
  134. 1340 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  135. 1350 IF INKEY$="" THEN 1340
  136. 1360 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  137. 1370 A$=INKEY$:IF A$="R" OR A$="r" THEN 1180 ELSE IF A$="N" OR A$="n" THEN 1560 ELSE IF A$<>"E" AND A$<>"e" THEN 1370
  138. 1380 GOTO 4280
  139. 1390 R=SQR(X*X+Y*Y)
  140. 1400 Z=2*EXP(-R)*COS(3*R)
  141. 1410 RETURN
  142. 1420 Y=INT(70*(C*Y+S*Z)+.5)
  143. 1430 IF Y<MIN THEN MIN=Y ELSE 1460
  144. 1440 PSET(320+X1,175-Y),14
  145. 1450 PSET(320-X1,175-Y),14
  146. 1460 IF Y>MAX THEN MAX=Y ELSE RETURN
  147. 1470 PSET(320+X1,175-Y)
  148. 1480 PSET(320-X1,175-Y)
  149. 1490 RETURN
  150. 1500 FOR K=0 TO NL
  151. 1510 Z=A(K)
  152. 1520 Y=K/LD
  153. 1530 GOSUB 1420
  154. 1540 NEXT K
  155. 1550 RETURN
  156. 1560 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=4
  157. 1570 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  158. 1580 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  159. 1590 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 or a>360 THEN A=75
  160. 1600 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  161. 1610 FOR I=-4*DD TO 0
  162. 1620 MAX=-100:MIN=100:X=I/DD:X1=INT(70*X+.5)
  163. 1630 NL=4*LD
  164. 1640 FOR K=-NL TO 0
  165. 1650 Y=K/LD
  166. 1660 GOSUB 1770
  167. 1670 A(-K)=Z
  168. 1680 GOSUB 1800
  169. 1690 NEXT K
  170. 1700 GOSUB 1880
  171. 1710 NEXT I
  172. 1720 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  173. 1730 IF INKEY$="" THEN 1720
  174. 1740 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  175. 1750 A$=INKEY$:IF A$="R" OR A$="r" THEN 1560 ELSE IF A$="N" OR A$="n" THEN 1940 ELSE IF A$<>"E" AND A$<>"e" THEN 1750
  176. 1760 GOTO 4280
  177. 1770 R=SQR(X*X+Y*Y)
  178. 1780 Z=2*EXP(-R)*COS(3*R)
  179. 1790 RETURN
  180. 1800 Y=INT(70*(C*Y+S*Z)+.5)
  181. 1810 IF Y<MIN THEN MIN=Y ELSE 1840
  182. 1820 PSET(320+X1,175-Y)
  183. 1830 PSET(320-X1,175-Y)
  184. 1840 IF Y>MAX THEN MAX=Y ELSE RETURN
  185. 1850 PSET(320+X1,175-Y)
  186. 1860 PSET(320-X1,175-Y)
  187. 1870 RETURN
  188. 1880 FOR K=0 TO NL
  189. 1890 Z=A(K)
  190. 1900 Y=K/LD
  191. 1910 GOSUB 1800
  192. 1920 NEXT K
  193. 1930 RETURN
  194. 1940 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=5
  195. 1950 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  196. 1960 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  197. 1970 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=70
  198. 1980 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  199. 1990 FOR I=0 TO 5*DD
  200. 2000 MAX=-200:MIN=200:X1=INT(52*(-5+I/DD)+.5):X2=-4+I/DD
  201. 2010 IF I<=2*DD THEN NL=INT(I/DD*4*LD) ELSE NL=8*LD
  202. 2020 FOR J=0 TO NL
  203. 2030 X=X2-J/4/LD:Y=-4+J/LD
  204. 2040 GOSUB 2150:Y(J)=Y:Z(J)=Z
  205. 2050 GOSUB 2180:NEXT J
  206. 2060 MAX=-200:MIN=200:X1=-X1
  207. 2070 FOR J=NL TO 0 STEP -1
  208. 2080 Y=-Y(J):Z=Z(J)
  209. 2090 GOSUB 2180:NEXT J,I
  210. 2100 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  211. 2110 IF INKEY$="" THEN 2100
  212. 2120 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext  or <E>xit";
  213. 2130 A$=INKEY$:IF A$="R" OR A$="r" THEN 1940 ELSE IF A$="N" OR A$="n" THEN 2250 ELSE IF A$<>"E" AND A$<>"e" THEN 2130
  214. 2140 GOTO 4280
  215. 2150 R=.75*SQR(X*X+Y*Y)
  216. 2160 Z=2*(COS(R)-COS(3*R)/3+COS(5*R)/5)+.25
  217. 2170 RETURN
  218. 2180 Y=INT(60*(C*Y+S*Z)+.5)
  219. 2190 IF M=4 THEN 2220
  220. 2200 IF Y<MIN THEN MIN=Y ELSE 2220
  221. 2210 PSET(320+X1,175-Y)
  222. 2220 IF Y>MAX THEN MAX=Y ELSE RETURN
  223. 2230 PSET(320+X1,175-Y)
  224. 2240 RETURN
  225. 2250 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=5
  226. 2260 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  227. 2270 DD=DD/2:DX=1/4/DD
  228. 2280 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  229. 2290 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=70
  230. 2300 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  231. 2310 FOR I=0 TO 5*DD
  232. 2320 MAX=-200:MIN=200:X1=INT(42*(-5+I/DD)+.5):X2=-4+I/DD
  233. 2330 IF I<2*DD THEN NL=INT(I/DD*4*LD) ELSE NL=8*LD
  234. 2340 FOR J=0 TO NL
  235. 2350 X=X2-J/4/LD:Y=-4+J/LD
  236. 2360 GOSUB 2470:Y(J)=Y:Z(J)=Z
  237. 2370 GOSUB 2500:NEXT J
  238. 2380 MAX=-200:MIN=200:X1=-X1
  239. 2390 FOR J=NL TO 0 STEP-1
  240. 2400 Y=-Y(J):Z=Z(J)
  241. 2410 GOSUB 2500:NEXT J,I
  242. 2420 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  243. 2430 IF INKEY$="" THEN 2420
  244. 2440 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  245. 2450 A$=INKEY$:IF A$="R" OR A$="r" THEN 2250 ELSE IF A$="N" OR A$="n" THEN 2570 ELSE IF A$<>"E" AND A$<>"e" THEN 2450
  246. 2460 GOTO 4280
  247. 2470 R=SQR(X*X+Y*Y)
  248. 2480 Z=COS(4*R)/(R/2+2)-3*R/8+1
  249. 2490 RETURN
  250. 2500 Y=INT(60*(C*Y+S*Z)+.5)
  251. 2510 IF M=4 THEN 2540
  252. 2520 IF Y<MIN THEN MIN=Y ELSE 2540
  253. 2530 PSET(320+X1,175-Y),14
  254. 2540 IF Y>MAX THEN MAX=Y ELSE RETURN
  255. 2550 PSET(320+X1,175-Y)
  256. 2560 RETURN
  257. 2570 CLS:LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=16
  258. 2580 DD=DD/2:DX=1/4/DD
  259. 2590 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  260. 2600 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=75
  261. 2610 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  262. 2620 FOR I=0 TO 7:FOR K=0 TO 1:FOR J=0 TO DD-1
  263. 2630 MAX=-100:MIN=100:X=-4+I/2+K/4+J*DX:X1=INT(70*X+.5):CC=16
  264. 2640 FOR L=0 TO 7:FOR N=1 TO 2
  265. 2650 IF K=0 THEN F=(-1)^N*(DD-J)*DX ELSE F=(-1)^N*J*DX
  266. 2660 Y=-3.75+L/2+F:GOSUB 2780
  267. 2670 Y(CC)=Y:Z(CC)=Z:CC=CC-1
  268. 2680 GOSUB 2810:NEXT N,L
  269. 2690 GOSUB 2900:NEXT J,K,I
  270. 2700 X1=0:MAX=-100:MIN=100
  271. 2710 FOR I=-4 TO 4 STEP .5:Y=I:GOSUB 2780:GOSUB 2810:NEXT I
  272. 2720 SOUND 1000,2
  273. 2730 T=TIMER:WHILE T+1.5>TIMER:WEND
  274. 2740 IF INKEY$="" THEN 2720
  275. 2750 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  276. 2760 A$=INKEY$:IF A$="R" OR A$="r" THEN 2570 ELSE IF A$="N" OR A$="n" THEN 2910 ELSE IF A$<>"E" AND A$<>"e" THEN 2760
  277. 2770 GOTO 4280
  278. 2780 R=SQR(X*X+Y*Y)
  279. 2790 Z=2.5*EXP(-R*R/4)
  280. 2800 RETURN
  281. 2810 Y=INT(70*(C*Y+S*Z)+.5)
  282. 2820 IF M=4 THEN 2860
  283. 2830 IF Y<MIN THEN MIN=Y ELSE 2860
  284. 2840 PSET(320+X1,175-Y)
  285. 2850 PSET(320-X1,175-Y)
  286. 2860 IF Y>MAX THEN MAX=Y ELSE RETURN
  287. 2870 PSET(320+X1,175-Y)
  288. 2880 PSET(320-X1,175-Y)
  289. 2890 RETURN
  290. 2900 FOR II=CC+1 TO 16:Z=Z(II):Y=-Y(II):GOSUB 2810:NEXT II:RETURN
  291. 2910 CLS:LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>8 THEN DD=16
  292. 2920 DD=DD/2:DX=1/4/DD
  293. 2930 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  294. 2940 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=65
  295. 2950 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  296. 2960 FOR I=0 TO 7:FOR K=0 TO 1:FOR J=0 TO DD-1
  297. 2970 MAX=-100:MIN=100:X=-4+I/2+K/4+J*DX:X1=INT(70*X+.5):CC=16
  298. 2980 FOR L=0 TO 7:FOR N=1 TO 2
  299. 2990 IF K=0 THEN F=(-1)^N*(DD-J)*DX ELSE F=(-1)^N*J*DX
  300. 3000 Y=-3.75+L/2+F:GOSUB 3140
  301. 3010 IF Y<-(X+4) THEN 3040
  302. 3020 Y(CC)=Y:Z(CC)=Z:CC=CC-1
  303. 3030 GOSUB 3170
  304. 3040 NEXT N,L
  305. 3050 GOSUB 3260:NEXT J,K,I
  306. 3060 X1=0:MAX=-100:MIN=100
  307. 3070 FOR I=-4 TO 4 STEP .5:Y=I:GOSUB 3140:GOSUB 3170:NEXT I
  308. 3080 SOUND 1000,2
  309. 3090 T=TIMER:WHILE T+1.5>TIMER:WEND
  310. 3100 IF INKEY$="" THEN 3080
  311. 3110 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  312. 3120 A$=INKEY$:IF A$="R" OR A$="r" THEN 2910 ELSE IF A$="N" OR A$="n" THEN 3270 ELSE IF A$<>"E" AND A$<>"e" THEN 3120
  313. 3130 GOTO 4280
  314. 3140 R=SQR(X*X+Y*Y)
  315. 3150 Z=1.25-3*EXP(-R*R/2)
  316. 3160 RETURN
  317. 3170 Y=INT(70*(C*Y+S*Z)+.5)
  318. 3180 IF M=4 THEN 3220
  319. 3190 IF Y<MIN THEN MIN=Y ELSE 3220
  320. 3200 PSET(320+X1,175-Y),14
  321. 3210 PSET(320-X1,175-Y),14
  322. 3220 IF Y>MAX THEN MAX=Y ELSE RETURN
  323. 3230 PSET(320+X1,175-Y)
  324. 3240 PSET(320-X1,175-Y)
  325. 3250 RETURN
  326. 3260 FOR II=CC+1 TO 16:Z=Z(II):Y=-Y(II):GOSUB 3170:NEXT II:RETURN
  327. 3270 CLS:LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  328. 3280 DD=DD/2:DX=1/4/DD
  329. 3290 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  330. 3300 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=70
  331. 3310 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  332. 3320 FOR I=0 TO 7:FOR K=0 TO 1:FOR J=0 TO DD-1
  333. 3330 MAX=-200:MIN=200:X=-4+I/2+K/4+J*DX:X1=INT(70*X+.5):CC=16
  334. 3340 FOR L=0 TO 7:FOR N=1 TO 2
  335. 3350 IF K=0 THEN F=(-1)^N*(DD-J)*DX ELSE F=(-1)^N*J*DX
  336. 3360 Y=-3.75+L/2+F:GOSUB 3500
  337. 3370 IF Y<-SQR(16-X*X) THEN 3400
  338. 3380 Y(CC)=Y:Z(CC)=Z:CC=CC-1
  339. 3390 GOSUB 3530
  340. 3400 NEXT N,L
  341. 3410 GOSUB 3620:NEXT J,K,I
  342. 3420 X1=0:MIN=200:MAX=-200
  343. 3430 FOR I=-4 TO 4 STEP .5:Y=I:GOSUB 3500:GOSUB 3530:NEXT I
  344. 3440 SOUND 1000,2
  345. 3450 T=TIMER:WHILE T+1.5>TIMER:WEND
  346. 3460 IF INKEY$="" THEN 3440
  347. 3470 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  348. 3480 A$=INKEY$:IF A$="R" OR A$="r" THEN 3270 ELSE IF A$="N" OR A$="n" THEN 3630 ELSE IF A$<>"E" AND A$<>"e" THEN 3480
  349. 3490 GOTO 4280
  350. 3500 R=SQR(X*X+Y*Y)
  351. 3510 Z=1.5*(COS(R)-COS(3*R)/3)+.5
  352. 3520 RETURN
  353. 3530 Y=INT(70*(C*Y+S*Z)+.5)
  354. 3540 IF M=4 THEN 3580
  355. 3550 IF Y<MIN THEN MIN=Y ELSE 3580
  356. 3560 PSET(320+X1,175-Y)
  357. 3570 PSET(320-X1,175-Y)
  358. 3580 IF Y>MAX THEN MAX=Y ELSE RETURN
  359. 3590 PSET(320+X1,175-Y)
  360. 3600 PSET(320-X1,175-Y)
  361. 3610 RETURN
  362. 3620 FOR II=CC+1 TO 16:Z=Z(II):Y=-Y(II):GOSUB 3530:NEXT II:RETURN
  363. 3630 CLS:LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=16
  364. 3640 DD=DD/2:DX=1/4/DD
  365. 3650 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  366. 3660 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=75
  367. 3670 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  368. 3680 FOR I=0 TO 7:FOR K=0 TO 1:FOR J=0 TO DD-1
  369. 3690 MAX=-200:MIN=200:X=-4+I/2+K/4+J*DX:X1=INT(70*X+.5):CC=16
  370. 3700 FOR L=0 TO 7:FOR N=1 TO 2
  371. 3710 IF K=0 THEN F=(-1)^N*(DD-J)*DX ELSE F=(-1)^N*J*DX
  372. 3720 Y=-3.75+L/2+F:GOSUB 3840
  373. 3730 Y(CC)=Y:Z(CC)=Z:CC=CC-1
  374. 3740 GOSUB 3870:NEXT N,L
  375. 3750 GOSUB 3960:NEXT J,K,I
  376. 3760 X1=0:MAX=-200:MIN=200
  377. 3770 FOR I=-4 TO 4 STEP .5:Y=I:GOSUB 3840:GOSUB 3870:NEXT I
  378. 3780 SOUND 1000,2
  379. 3790 T=TIMER:WHILE T+1.5>TIMER:WEND
  380. 3800 IF INKEY$="" THEN 3780
  381. 3810 LOCATE 25,1:PRINT"Press <R>epeat, <N>ext or <E>xit";
  382. 3820 A$=INKEY$:IF A$="R" OR A$="r" THEN 3630 ELSE IF A$="N" OR A$="n" THEN 3970 ELSE IF A$<>"E" AND A$<>"e" THEN 3820
  383. 3830 GOTO 4280
  384. 3840 R=SQR(X*X+Y*Y)
  385. 3850 Z=COS(4*R)/(R/2+2)-3*R/8+1
  386. 3860 RETURN
  387. 3870 Y=INT(70*(C*Y+S*Z)+.5)
  388. 3880 IF M=4 THEN 3920
  389. 3890 IF Y<MIN THEN MIN=Y ELSE 3920
  390. 3900 PSET(320+X1,175-Y)
  391. 3910 PSET(320-X1,175-Y)
  392. 3920 IF Y>MAX THEN MAX=Y ELSE RETURN
  393. 3930 PSET(320+X1,175-Y)
  394. 3940 PSET(320-X1,175-Y)
  395. 3950 RETURN
  396. 3960 FOR II=CC+1 TO 16:Z=Z(II):Y=-Y(II):GOSUB 3870:NEXT II:RETURN
  397. 3970 CLS:LOCATE 10,30:INPUT "Line density (MAX=8)";LD$:LD=VAL(LD$):IF LD=0 or ld>8 THEN LD=5
  398. 3980 LOCATE 12,33:INPUT "Dot density";DD$:DD=VAL(DD$):IF DD=0 or dd>64 THEN DD=32
  399. 3990 LOCATE 14,30:PRINT"Seclect Viewing Angle":PRINT TAB(30)"   0 degrees is from overheard":PRINT TAB(30)"  90 degrees is from the side"
  400. 4000 LOCATE 18,30:INPUT "Angle in degrees";A$:A=VAL(A$):IF a=<0 THEN A=70
  401. 4010 A=A*3.14159/180:S=SIN(A):C=COS(A):CLS
  402. 4020 FOR I=0 TO 5*DD
  403. 4030 MAX=-200:MIN=200:X1=INT(52*(-5+I/DD)+.5):X2=-4+I/DD
  404. 4040 IF I<=2*DD THEN NL=INT(I/DD*4*LD) ELSE NL=8*LD
  405. 4050 FOR J=0 TO NL
  406. 4060 X=X2-J/4/LD:Y=-4+J/LD
  407. 4070 GOSUB 4180:Y(J)=Y:Z(J)=Z
  408. 4080 GOSUB 4210:NEXT J
  409. 4090 MAX=-200:MIN=200:X1=-X1
  410. 4100 FOR J=NL TO 0 STEP -1
  411. 4110 Y=-Y(J):Z=Z(J)
  412. 4120 GOSUB 4210:NEXT J,I
  413. 4130 SOUND 1000,2:T=TIMER:WHILE T+1.5>TIMER:WEND
  414. 4140 IF INKEY$="" THEN 4130
  415. 4150 LOCATE 25,1:PRINT"Press <R>epeat or <E>xit";
  416. 4160 A$=INKEY$:IF A$="R" OR A$="r" THEN 3970 ELSE IF A$<>"E" AND A$<>"e" THEN 4160
  417. 4170 GOTO 4280
  418. 4180 R=SQR(X*X+Y*Y)
  419. 4190 Z=COS(4*R)/(R/2+2)-3*R/8+1
  420. 4200 RETURN
  421. 4210 Y=INT(65*(C*Y+S*Z)+.5)
  422. 4220 IF M=4 THEN 4250
  423. 4230 IF Y<MIN THEN MIN=Y ELSE 4250
  424. 4240 PSET(320+X1,175-Y)
  425. 4250 IF Y>MAX THEN MAX=Y ELSE RETURN
  426. 4260 PSET(320+X1,175-Y)
  427. 4270 RETURN
  428. 4280 cls:end
  429.