SCREEN 12 RANDOMIZE (TIMER) pi = 4 * ATN(1) tau = (SQR(5) + 1) / 2 cosatntau = COS(ATN(tau)): REM approx. .525731112 sinatntau = SIN(ATN(tau)): REM approx. .850650808 height1 = cosatntau / 2: REM approx. .252865556 height2 = height1 + sinatntau: REM approx. 1.113516364 radius1 = sinatntau: REM approx. .850650808 radius2 = radius1 * tau: REM approx. 1.37638102 scale = 150 xxcentre = 319 + 93 yycentre = 239 + 17 theta = 18 thetarad = theta * pi / 180 REM phi = ATN(SQR(2)) phi = 63.1 phi = 37.5: REM gives elevation of 52.5ø. artan((tau+1)/2) = 52.62263186ø. REM With theta = 18ø, appears to give view directly over vertex. phirad = phi * pi / 180 DIM angle(9) FOR i = 0 TO 9 angle(i) = 2 * pi * i / 10 NEXT i DIM x(20), y(20), Z(20), xx(20), yy(20) FOR i = 1 TO 10 x(i) = COS((3 + 2 * i) * pi / 5) y(i) = SIN((3 + 2 * i) * pi / 5) NEXT i FOR i = 11 TO 20 x(i) = COS(pi + (3 + 2 * i) * pi / 5) y(i) = SIN(pi + (3 + 2 * i) * pi / 5) NEXT i FOR i = 1 TO 20 IF i < 6 OR i > 15 THEN x(i) = x(i) * radius1 y(i) = y(i) * radius1 ELSE x(i) = x(i) * radius2 y(i) = y(i) * radius2 END IF NEXT i FOR i = 6 TO 10 Z(i) = height1 NEXT i FOR i = 1 TO 5 Z(i) = height2 NEXT i FOR i = 11 TO 20 Z(i) = -Z(21 - i) NEXT i bottomcolour = 4: REM red lowerstrutscolour = 14: REM yellow tropicalbandcolour = 2: REM green upperstrutscolour = 9: REM light blue topcolour = 13: REM light magenta GOSUB workoutcoordinates GOSUB drawdode COLOR 7 LOCATE 1, 1: PRINT "theta = degrees Press L or R arrow keys to spin "; : COLOR 12: PRINT "Esc to quit": COLOR 7 LOCATE 2, 1: PRINT "elev. = degrees Press U or D arrow keys to change elevation" LOCATE 3, 26: PRINT "(Ctrl => 0.25ø movements; Alt => 4ø movements)" LOCATE 1, 9: PRINT " " LOCATE 1, 9: PRINT theta LOCATE 2, 9: PRINT " " LOCATE 2, 9: PRINT 90 - phi LOCATE 12, 2: PRINT "EDGE LENGTH:" LOCATE 13, 6: PRINT "pixels" LOCATE 13, 1: PRINT scale LOCATE 14, 2: PRINT "(Max. = 150)" LOCATE 16, 2: PRINT "Z zooms in" LOCATE 17, 2: PRINT "X zooms out" LOCATE 19, 2: PRINT "(Shift =>" LOCATE 20, 2: PRINT "10 pixels" LOCATE 21, 2: PRINT "at a time)" LOCATE 30, 1: PRINT " artan 2 ÷ 63.5ø artan û2 ÷ 54.75ø artan tau ÷ 58.25ø"; COLOR 6 LOCATE 6, 1: PRINT "REGULAR DODECAHEDRON ANIMATION" LOCATE 8, 1: PRINT "Copyright (c) 2005" LOCATE 9, 1: PRINT "by Mad Teddy" COLOR 7 a$ = "" DO UNTIL a$ = CHR$(27) a$ = INKEY$ IF a$ <> "" THEN a$ = RIGHT$(a$, 1) IF a$ = CHR$(141) AND phi > 0 THEN phi = phi - .25 IF phi <= 0 THEN BEEP phi = 0 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(72) AND phi > 0 THEN phi = phi - 1 IF phi <= 0 THEN BEEP phi = 0 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(152) AND phi > 0 THEN phi = phi - 4 IF phi <= 0 THEN BEEP phi = 0 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(145) AND phi < 90 THEN phi = phi + .25 IF phi >= 90 THEN BEEP phi = 90 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(80) AND phi < 90 THEN phi = phi + 1 IF phi >= 90 THEN BEEP phi = 90 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(160) AND phi < 90 THEN phi = phi + 4 IF phi >= 90 THEN BEEP phi = 90 END IF phirad = phi * pi / 180 ELSEIF a$ = CHR$(115) THEN IF theta = 0 THEN theta = 71.75 ELSE theta = theta - .25 END IF thetarad = theta * pi / 180 ELSEIF a$ = CHR$(75) THEN IF theta < 1 THEN theta = theta + 72 END IF theta = theta - 1 thetarad = theta * pi / 180 ELSEIF a$ = CHR$(155) THEN IF theta < 4 THEN theta = theta + 72 END IF theta = theta - 4 thetarad = theta * pi / 180 ELSEIF a$ = CHR$(116) THEN IF theta = 71.75 THEN theta = 0 ELSE theta = theta + .25 END IF thetarad = theta * pi / 180 ELSEIF a$ = CHR$(77) THEN IF theta >= 71 THEN theta = theta - 72 END IF theta = theta + 1 thetarad = theta * pi / 180 ELSEIF a$ = CHR$(157) THEN IF theta >= 68 THEN theta = theta - 72 END IF theta = theta + 4 thetarad = theta * pi / 180 ELSEIF a$ = "z" AND scale < 150 THEN scale = scale + 1 ELSEIF a$ = "Z" AND scale < 150 THEN scale = scale + 10 IF scale > 150 THEN BEEP scale = 150 END IF ELSEIF a$ = "x" AND scale > 0 THEN scale = scale - 1 ELSEIF a$ = "X" AND scale > 0 THEN scale = scale - 10 IF scale < 0 THEN BEEP scale = 0 END IF END IF IF a$ = CHR$(115) OR a$ = CHR$(75) OR a$ = CHR$(155) OR a$ = CHR$(116) OR a$ = CHR$(77) OR a$ = CHR$(157) THEN LOCATE 1, 9: PRINT " " LOCATE 1, 9: PRINT theta ELSEIF a$ = CHR$(141) OR a$ = CHR$(72) OR a$ = CHR$(152) OR a$ = CHR$(145) OR a$ = CHR$(80) OR a$ = CHR$(160) THEN LOCATE 2, 9: PRINT " " LOCATE 2, 9: PRINT 90 - phi ELSEIF a$ = "z" OR a$ = "Z" OR a$ = "x" OR a$ = "X" THEN LOCATE 13, 1: PRINT scale END IF END IF REM FOR j = 1 TO 10000 REM NEXT j IF a$ = CHR$(115) OR a$ = CHR$(75) OR a$ = CHR$(155) OR a$ = CHR$(116) OR a$ = CHR$(77) OR a$ = CHR$(157) OR a$ = CHR$(141) OR a$ = CHR$(72) OR a$ = CHR$(152) OR a$ = CHR$(145) OR a$ = CHR$(80) OR a$ = CHR$(160) OR a$ = "z" OR a$ = "Z" OR a$ = _ "x" OR a$ = "X" THEN GOSUB erasedode REM GOSUB drawaxes GOSUB workoutcoordinates GOSUB drawdode END IF LOOP END REM *** SUBROUTINES *** drawdode: REM bottom LINE (xxcentre + xx(16), yycentre - yy(16))-(xxcentre + xx(17), yycentre - yy(17)), bottomcolour LINE (xxcentre + xx(17), yycentre - yy(17))-(xxcentre + xx(18), yycentre - yy(18)), bottomcolour LINE (xxcentre + xx(18), yycentre - yy(18))-(xxcentre + xx(19), yycentre - yy(19)), bottomcolour LINE (xxcentre + xx(19), yycentre - yy(19))-(xxcentre + xx(20), yycentre - yy(20)), bottomcolour LINE (xxcentre + xx(20), yycentre - yy(20))-(xxcentre + xx(16), yycentre - yy(16)), bottomcolour REM lower struts LINE (xxcentre + xx(16), yycentre - yy(16))-(xxcentre + xx(11), yycentre - yy(11)), lowerstrutscolour LINE (xxcentre + xx(17), yycentre - yy(17))-(xxcentre + xx(12), yycentre - yy(12)), lowerstrutscolour LINE (xxcentre + xx(18), yycentre - yy(18))-(xxcentre + xx(13), yycentre - yy(13)), lowerstrutscolour LINE (xxcentre + xx(19), yycentre - yy(19))-(xxcentre + xx(14), yycentre - yy(14)), lowerstrutscolour LINE (xxcentre + xx(20), yycentre - yy(20))-(xxcentre + xx(15), yycentre - yy(15)), lowerstrutscolour REM tropical band LINE (xxcentre + xx(6), yycentre - yy(6))-(xxcentre + xx(14), yycentre - yy(14)), tropicalbandcolour LINE (xxcentre + xx(14), yycentre - yy(14))-(xxcentre + xx(7), yycentre - yy(7)), tropicalbandcolour LINE (xxcentre + xx(7), yycentre - yy(7))-(xxcentre + xx(15), yycentre - yy(15)), tropicalbandcolour LINE (xxcentre + xx(15), yycentre - yy(15))-(xxcentre + xx(8), yycentre - yy(8)), tropicalbandcolour LINE (xxcentre + xx(8), yycentre - yy(8))-(xxcentre + xx(11), yycentre - yy(11)), tropicalbandcolour LINE (xxcentre + xx(11), yycentre - yy(11))-(xxcentre + xx(9), yycentre - yy(9)), tropicalbandcolour LINE (xxcentre + xx(9), yycentre - yy(9))-(xxcentre + xx(12), yycentre - yy(12)), tropicalbandcolour LINE (xxcentre + xx(12), yycentre - yy(12))-(xxcentre + xx(10), yycentre - yy(10)), tropicalbandcolour LINE (xxcentre + xx(10), yycentre - yy(10))-(xxcentre + xx(13), yycentre - yy(13)), tropicalbandcolour LINE (xxcentre + xx(13), yycentre - yy(13))-(xxcentre + xx(6), yycentre - yy(6)), tropicalbandcolour REM upper struts LINE (xxcentre + xx(6), yycentre - yy(6))-(xxcentre + xx(1), yycentre - yy(1)), upperstrutscolour LINE (xxcentre + xx(7), yycentre - yy(7))-(xxcentre + xx(2), yycentre - yy(2)), upperstrutscolour LINE (xxcentre + xx(8), yycentre - yy(8))-(xxcentre + xx(3), yycentre - yy(3)), upperstrutscolour LINE (xxcentre + xx(9), yycentre - yy(9))-(xxcentre + xx(4), yycentre - yy(4)), upperstrutscolour LINE (xxcentre + xx(10), yycentre - yy(10))-(xxcentre + xx(5), yycentre - yy(5)), upperstrutscolour REM top LINE (xxcentre + xx(1), yycentre - yy(1))-(xxcentre + xx(2), yycentre - yy(2)), topcolour LINE (xxcentre + xx(2), yycentre - yy(2))-(xxcentre + xx(3), yycentre - yy(3)), topcolour LINE (xxcentre + xx(3), yycentre - yy(3))-(xxcentre + xx(4), yycentre - yy(4)), topcolour LINE (xxcentre + xx(4), yycentre - yy(4))-(xxcentre + xx(5), yycentre - yy(5)), topcolour LINE (xxcentre + xx(5), yycentre - yy(5))-(xxcentre + xx(1), yycentre - yy(1)), topcolour RETURN erasedode: REM bottom LINE (xxcentre + xx(16), yycentre - yy(16))-(xxcentre + xx(17), yycentre - yy(17)), 0 LINE (xxcentre + xx(17), yycentre - yy(17))-(xxcentre + xx(18), yycentre - yy(18)), 0 LINE (xxcentre + xx(18), yycentre - yy(18))-(xxcentre + xx(19), yycentre - yy(19)), 0 LINE (xxcentre + xx(19), yycentre - yy(19))-(xxcentre + xx(20), yycentre - yy(20)), 0 LINE (xxcentre + xx(20), yycentre - yy(20))-(xxcentre + xx(16), yycentre - yy(16)), 0 REM lower struts LINE (xxcentre + xx(16), yycentre - yy(16))-(xxcentre + xx(11), yycentre - yy(11)), 0 LINE (xxcentre + xx(17), yycentre - yy(17))-(xxcentre + xx(12), yycentre - yy(12)), 0 LINE (xxcentre + xx(18), yycentre - yy(18))-(xxcentre + xx(13), yycentre - yy(13)), 0 LINE (xxcentre + xx(19), yycentre - yy(19))-(xxcentre + xx(14), yycentre - yy(14)), 0 LINE (xxcentre + xx(20), yycentre - yy(20))-(xxcentre + xx(15), yycentre - yy(15)), 0 REM tropical band LINE (xxcentre + xx(6), yycentre - yy(6))-(xxcentre + xx(14), yycentre - yy(14)), 0 LINE (xxcentre + xx(14), yycentre - yy(14))-(xxcentre + xx(7), yycentre - yy(7)), 0 LINE (xxcentre + xx(7), yycentre - yy(7))-(xxcentre + xx(15), yycentre - yy(15)), 0 LINE (xxcentre + xx(15), yycentre - yy(15))-(xxcentre + xx(8), yycentre - yy(8)), 0 LINE (xxcentre + xx(8), yycentre - yy(8))-(xxcentre + xx(11), yycentre - yy(11)), 0 LINE (xxcentre + xx(11), yycentre - yy(11))-(xxcentre + xx(9), yycentre - yy(9)), 0 LINE (xxcentre + xx(9), yycentre - yy(9))-(xxcentre + xx(12), yycentre - yy(12)), 0 LINE (xxcentre + xx(12), yycentre - yy(12))-(xxcentre + xx(10), yycentre - yy(10)), 0 LINE (xxcentre + xx(10), yycentre - yy(10))-(xxcentre + xx(13), yycentre - yy(13)), 0 LINE (xxcentre + xx(13), yycentre - yy(13))-(xxcentre + xx(6), yycentre - yy(6)), 0 REM upper struts LINE (xxcentre + xx(6), yycentre - yy(6))-(xxcentre + xx(1), yycentre - yy(1)), 0 LINE (xxcentre + xx(7), yycentre - yy(7))-(xxcentre + xx(2), yycentre - yy(2)), 0 LINE (xxcentre + xx(8), yycentre - yy(8))-(xxcentre + xx(3), yycentre - yy(3)), 0 LINE (xxcentre + xx(9), yycentre - yy(9))-(xxcentre + xx(4), yycentre - yy(4)), 0 LINE (xxcentre + xx(10), yycentre - yy(10))-(xxcentre + xx(5), yycentre - yy(5)), 0 REM top LINE (xxcentre + xx(1), yycentre - yy(1))-(xxcentre + xx(2), yycentre - yy(2)), 0 LINE (xxcentre + xx(2), yycentre - yy(2))-(xxcentre + xx(3), yycentre - yy(3)), 0 LINE (xxcentre + xx(3), yycentre - yy(3))-(xxcentre + xx(4), yycentre - yy(4)), 0 LINE (xxcentre + xx(4), yycentre - yy(4))-(xxcentre + xx(5), yycentre - yy(5)), 0 LINE (xxcentre + xx(5), yycentre - yy(5))-(xxcentre + xx(1), yycentre - yy(1)), 0 RETURN drawaxes: LINE (xxcentre, 0)-(xxcentre, 479), 8 LINE (0, yycentre)-(639, yycentre), 8 RETURN workoutcoordinates: FOR i = 1 TO 20 xx(i) = (x(i) * COS(thetarad) - y(i) * SIN(thetarad)) * scale yy(i) = ((x(i) * SIN(thetarad) + y(i) * COS(thetarad)) * COS(phirad) + Z(i) * SIN(phirad)) * scale REM PSET (xxcentre + xx(i), yycentre - yy(i)), 15 NEXT i RETURN