|
4 | 4 | 40 MODE 1
|
5 | 5 | 50 PRINT "3D Cube Demo"
|
6 | 6 | 60 PRINT
|
7 |
| - 70 INPUT "SOLID (S) OR WIREFRAME (W)";F$: FILLED%=F$="S" |
8 |
| - 80 INPUT "MODE (0 TO 2)";M% |
9 |
| - 110 MODE M% |
10 |
| - 115 VDU 29,640;512;:OD=128 |
11 |
| - 120 : |
12 |
| - 130 REM Initialise the data |
13 |
| - 140 READ CN% |
14 |
| - 150 DIM X%(CN%),Y%(CN%),Z%(CN%),A%(CN%),B%(CN%) |
15 |
| - 160 FOR I%=1 TO CN%: READ X%(I%),Y%(I%),Z%(I%):NEXT |
16 |
| - 170 READ TS% |
17 |
| - 180 DIM S%(TS%,5) |
18 |
| - 190 FOR I%=1 TO TS%: READ S%(I%,1),S%(I%,2),S%(I%,3),S%(I%,4),S%(I%,5):NEXT |
19 |
| - 200 REM Variables |
20 |
| - 210 THETA=0:PSI=0:PHI=0 |
21 |
| - 220 XD=0:YD=0 |
22 |
| - 230 SD=1024 |
23 |
| - 240 REM Transform |
24 |
| - 250 FOR I%=1 TO CN% |
25 |
| - 260 REM Rotate |
26 |
| - 270 XX=X%(I%):YY=Y%(I%):ZZ=Z%(I%) |
27 |
| - 280 Y=YY*COS(PHI/180*PI)-ZZ*SIN(PHI/180*PI) |
28 |
| - 290 ZZ=YY*SIN(PHI/180*PI)+ZZ*COS(PHI/180*PI) |
29 |
| - 300 X=XX*COS(THETA/180*PI)-ZZ*SIN(THETA/180*PI) |
30 |
| - 310 ZZ=XX*SIN(THETA/180*PI)+ZZ*COS(THETA/180*PI) |
31 |
| - 320 XX=X*COS(PSI/180*PI)-Y*SIN(PSI/180*PI) |
32 |
| - 330 YY=X*SIN(PSI/180*PI)+Y*COS(PSI/180*PI) |
33 |
| - 340 REM Transform |
34 |
| - 350 XX=XX+XD:YY=YY+YD |
35 |
| - 360 REM Perspective |
36 |
| - 370 A%(I%)=XX*SD/(OD-ZZ) |
37 |
| - 380 B%(I%)=YY*SD/(OD-ZZ) |
38 |
| - 390 NEXT |
39 |
| - 400 REM Draw |
40 |
| - 410 CLS |
41 |
| - 415 I%=RND(-55) |
42 |
| - 420 FOR I%=1 TO TS% |
43 |
| - 425 GCOL 0,S%(I%,5) |
44 |
| - 430 C1%=S%(I%,1):C2%=S%(I%,2):C3%=S%(I%,3):C4%=S%(I%,4) |
45 |
| - 440 X1=A%(C1%):X2=A%(C2%):X3=A%(C3%):X4=A%(C4%) |
46 |
| - 450 Y1=B%(C1%):Y2=B%(C2%):Y3=B%(C3%):Y4=B%(C4%) |
47 |
| - 460 IF X1*(Y2-Y3)+X2*(Y3-Y1)+X3*(Y1-Y2) > 0 THEN GOTO 530 |
48 |
| - 480 IF FILLED%=0 THEN GOTO 520 |
49 |
| - 490 MOVE X1,Y1:MOVE X2,Y2:PLOT 85,X3,Y3 |
50 |
| - 500 MOVE X3,Y3:MOVE X4,Y4:PLOT 85,X1,Y1 |
51 |
| - 510 GOTO 530 |
52 |
| - 520 MOVE X1,Y1:PLOT 5,X2,Y2:PLOT 5,X3,Y3:PLOT 5,X4,Y4:PLOT 5,X1,Y1 |
53 |
| - 530 NEXT |
54 |
| - 540 PHI=PHI+4 |
55 |
| - 550 THETA=THETA-1 |
56 |
| - 560 GOTO 250 |
57 |
| - 570 REM DATA |
58 |
| - 580 DATA 8 |
59 |
| - 590 DATA -20,20,20 |
60 |
| - 600 DATA 20,20,20 |
61 |
| - 610 DATA -20,-20,20 |
62 |
| - 620 DATA 20,-20,20 |
63 |
| - 630 DATA -20,20,-20 |
64 |
| - 640 DATA 20,20,-20 |
65 |
| - 650 DATA -20,-20,-20 |
66 |
| - 660 DATA 20,-20,-20 |
67 |
| - 670 DATA 6 |
68 |
| - 680 DATA 1,2,4,3,9 |
69 |
| - 690 DATA 7,8,6,5,10 |
70 |
| - 700 DATA 2,6,8,4,11 |
71 |
| - 710 DATA 3,7,5,1,12 |
72 |
| - 720 DATA 3,4,8,7,13 |
73 |
| - 730 DATA 1,5,6,2,14 |
| 7 | + 70 PRINT "Valid video modes:" |
| 8 | + 80 PRINT "0-6, 8-18, 129, 130, 132-134, 136-143" |
| 9 | + 90 PRINT "Modes greater than 128 are double-buffered" |
| 10 | + 100 PRINT |
| 11 | + 110 INPUT "SOLID (S) OR WIREFRAME (W)";F$: FILLED%=F$="S" |
| 12 | + 120 INPUT "MODE";M% |
| 13 | + 130 MODE M% |
| 14 | + 140 VDU 29,640;512;:OD=128 |
| 15 | + 150 : |
| 16 | + 160 REM Initialise the data |
| 17 | + 170 READ CN% |
| 18 | + 180 DIM X%(CN%),Y%(CN%),Z%(CN%),A%(CN%),B%(CN%) |
| 19 | + 190 FOR I%=1 TO CN%: READ X%(I%),Y%(I%),Z%(I%):NEXT |
| 20 | + 200 READ TS% |
| 21 | + 210 DIM S%(TS%,5) |
| 22 | + 220 FOR I%=1 TO TS%: READ S%(I%,1),S%(I%,2),S%(I%,3),S%(I%,4),S%(I%,5):NEXT |
| 23 | + 230 REM Variables |
| 24 | + 240 THETA=0:PSI=0:PHI=0 |
| 25 | + 250 XD=0:YD=0 |
| 26 | + 260 SD=1024 |
| 27 | + 270 REM Transform |
| 28 | + 280 FOR I%=1 TO CN% |
| 29 | + 290 REM Rotate |
| 30 | + 300 XX=X%(I%):YY=Y%(I%):ZZ=Z%(I%) |
| 31 | + 310 Y=YY*COS(PHI/180*PI)-ZZ*SIN(PHI/180*PI) |
| 32 | + 320 ZZ=YY*SIN(PHI/180*PI)+ZZ*COS(PHI/180*PI) |
| 33 | + 330 X=XX*COS(THETA/180*PI)-ZZ*SIN(THETA/180*PI) |
| 34 | + 340 ZZ=XX*SIN(THETA/180*PI)+ZZ*COS(THETA/180*PI) |
| 35 | + 350 XX=X*COS(PSI/180*PI)-Y*SIN(PSI/180*PI) |
| 36 | + 360 YY=X*SIN(PSI/180*PI)+Y*COS(PSI/180*PI) |
| 37 | + 370 REM Transform |
| 38 | + 380 XX=XX+XD:YY=YY+YD |
| 39 | + 390 REM Perspective |
| 40 | + 400 A%(I%)=XX*SD/(OD-ZZ) |
| 41 | + 410 B%(I%)=YY*SD/(OD-ZZ) |
| 42 | + 420 NEXT |
| 43 | + 430 REM Draw |
| 44 | + 440 CLS |
| 45 | + 450 I%=RND(-55) |
| 46 | + 460 FOR I%=1 TO TS% |
| 47 | + 470 GCOL 0,S%(I%,5) |
| 48 | + 480 C1%=S%(I%,1):C2%=S%(I%,2):C3%=S%(I%,3):C4%=S%(I%,4) |
| 49 | + 490 X1=A%(C1%):X2=A%(C2%):X3=A%(C3%):X4=A%(C4%) |
| 50 | + 500 Y1=B%(C1%):Y2=B%(C2%):Y3=B%(C3%):Y4=B%(C4%) |
| 51 | + 510 IF X1*(Y2-Y3)+X2*(Y3-Y1)+X3*(Y1-Y2) > 0 THEN GOTO 570 |
| 52 | + 520 IF FILLED%=0 THEN GOTO 560 |
| 53 | + 530 MOVE X1,Y1:MOVE X2,Y2:PLOT 85,X3,Y3 |
| 54 | + 540 MOVE X3,Y3:MOVE X4,Y4:PLOT 85,X1,Y1 |
| 55 | + 550 GOTO 570 |
| 56 | + 560 MOVE X1,Y1:PLOT 5,X2,Y2:PLOT 5,X3,Y3:PLOT 5,X4,Y4:PLOT 5,X1,Y1 |
| 57 | + 570 NEXT |
| 58 | + 580 PHI=PHI+4 |
| 59 | + 590 THETA=THETA-1 |
| 60 | + 600 VDU 23,0,&C3 |
| 61 | + 610 GOTO 280 |
| 62 | + 620 REM DATA |
| 63 | + 630 DATA 8 |
| 64 | + 640 DATA -20,20,20 |
| 65 | + 650 DATA 20,20,20 |
| 66 | + 660 DATA -20,-20,20 |
| 67 | + 670 DATA 20,-20,20 |
| 68 | + 680 DATA -20,20,-20 |
| 69 | + 690 DATA 20,20,-20 |
| 70 | + 700 DATA -20,-20,-20 |
| 71 | + 710 DATA 20,-20,-20 |
| 72 | + 720 DATA 6 |
| 73 | + 730 DATA 1,2,4,3,9 |
| 74 | + 740 DATA 7,8,6,5,10 |
| 75 | + 750 DATA 2,6,8,4,11 |
| 76 | + 760 DATA 3,7,5,1,12 |
| 77 | + 770 DATA 3,4,8,7,13 |
| 78 | + 780 DATA 1,5,6,2,14 |
0 commit comments