BBS: Inland Empire Archive Date: 09-22-93 (17:04) Number: 21 From: IAN REMMLER Refer#: NONE To: CALVIN FRENCH Recvd: NO Subj: CUBE.BAS (1/2) Conf: (2) Quik_Bas
Hey Calvin!
Well, here's a little example of how I accomplished 3D rotation.
Like I said, I'm not sure this is exactly how it's supposed to
be done, but the cube rotates and it stays the shape of a cube
so I guess it's good enough. I didn't take the time to comment
it so if you don't understand why I did something just ask.
'>>> Page 1 of CUBE.BAS begins here. TYPE:BAS
DEFINT A-Z
CONST PI = 3.14159265358979#
TYPE coord
x1 AS INTEGER
y1 AS INTEGER
z1 AS INTEGER
x2 AS INTEGER
y2 AS INTEGER
z2 AS INTEGER
END TYPE
DIM pnt(11) AS coord
DIM rot(1, 11) AS coord
DIM tmp AS coord
DIM sn&(359), cs&(359)
FOR n = 0 TO 11
READ pnt(n).x1, pnt(n).y1, pnt(n).z1, pnt(n).x2, pnt(n).y2, pnt(n)..z2
NEXT
SCREEN 9
WINDOW (-320, -240)-(320, 240)
FOR n = 0 TO 359
sn&(n) = SIN(n / 180 * PI) * 1024
cs&(n) = COS(n / 180 * PI) * 1024
NEXT
sx = SGN(RND - .5)
sy = SGN(RND - .5)
GOSUB RandRot
DO
s = 1 - s
SCREEN , , s, 1 - s
FOR n = 0 TO 11
LINE (rot(s, n).x1, rot(s, n).y1)-(rot(s, n).x2, rot(s, n).y2), 0
NEXT
x = x + 10 * sx: y = y + 10 * sy
IF ABS(x) > 240 THEN sx = -sx: GOSUB RandRot
IF ABS(y) > 140 THEN sy = -sy: GOSUB RandRot
a = (a + da) MOD 360: b = (b + db) MOD 360: c = (c + dc) MOD 360
FOR n = 0 TO 11
'The following are based on these 2 formulas
'xnew = cos(angle)*x + sin(angle)*y
'ynew = -sin(angle)*x + cos(angle)*y
tmp.z1 = (cs&(a) * pnt(n).z1 + sn&(a) * pnt(n).y1) / 1024
tmp.y1 = (-sn&(a) * pnt(n).z1 + cs&(a) * pnt(n).y1) / 1024
tmp.z2 = (cs&(a) * pnt(n).z2 + sn&(a) * pnt(n).y2) / 1024
tmp.y2 = (-sn&(a) * pnt(n).z2 + cs&(a) * pnt(n).y2) / 1024
tmp.x1 = (cs&(b) * pnt(n).x1 + sn&(b) * tmp.z1) / 1024
rot(s, n).z1 = (-sn&(b) * pnt(n).x1 + cs&(b) * tmp.z1) / 1024
tmp.x2 = (cs&(b) * pnt(n).x2 + sn&(b) * tmp.z2) / 1024
rot(s, n).z2 = (-sn&(b) * pnt(n).x2 + cs&(b) * tmp.z2) / 1024
rot(s, n).x1 = (cs&(c) * tmp.x1 + sn&(c) * tmp.y1) / 1024 + x
rot(s, n).y1 = (-sn&(c) * tmp.x1 + cs&(c) * tmp.y1) / 1024 + y
rot(s, n).x2 = (cs&(c) * tmp.x2 + sn&(c) * tmp.y2) / 1024 + x
rot(s, n).y2 = (-sn&(c) * tmp.x2 + cs&(c) * tmp.y2) / 1024 + y
LINE (rot(s, n).x1, rot(s, n).y1)-(rot(s, n).x2, rot(s, n).y2), 1
NEXT
LOOP UNTIL LEN(INKEY$)
END
RandRot:
'>>> Page 1 of CUBE.BAS ends here. Continued on next page.
--- Blue Wave/QBBS v2.12 [NR]
* Origin: Dusty's Palace (210)-625-4479 New Braunfels, TX (1:387/1001.0)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET