#constant width=1024 #constant height=768 SetWindowSize(width,height,0) SetVirtualResolution(width,height) global l#, speed# as float global vertices# as float[16,4] global faces as integer [32,4] global x#, y#, z#, w# as float global i, p, p1, p2, p3, p4, p5, p6, p7, p8 global persp# = 400 global PI# as float global vertex1# as float[4] global vertex2# as float[4] global vertex3# as float[4] global vertex4# as float[4] l#=64 Angle#=0.5 PI#=0.5 speed#=2 logo=createtext("Damian's version of the Tesseract") SetTextSize(logo,30) text=createtext("Press 'Space' to STOP spin, 'R' to reset, Cursors to spin, WASD to use 4D feature") SetTextSize(text,15) text1=createtext("Press 'O and L' to change perspective, press 'ESC' to quit") SetTextSize(text1,15) setupvertices#() do SetTextPosition(logo, width/2-GetTextTotalWidth(logo)/2,10) drawvertices#(width/2,height/2,1,1) drawFaces(width/2,height/2,1,1) checkkeypresses() SetTextPosition(text, width/2-GetTextTotalWidth(text)/2, height-100) SetTextPosition(text1, width/2-GetTextTotalWidth(text1)/2, height-50) sync() loop function checkkeypresses() if GetRawKeyState(38)=1 rotateXW4D(speed#) endif if GetRawKeyState(40)=1 rotateXW4D(speed#) endif if GetRawKeyState(37)=1 rotateYW4D(-speed#) endif if GetRawKeyState(39)=1 rotateYW4D(speed#) endif if GetRawKeyState(79)=1 // O persp#=persp#-speed# endif if GetRawKeyState(76)=1 // L persp#=persp#+speed# endif if GetRawKeyState(82)=1 // R setupvertices#() endif // 4D bits if GetRawKeyState(87)=1 // W rotateXz4D(speed#) endif if GetRawKeyState(83)=1 // S rotateXZ4D(-speed#) endif if GetRawKeyState(65)=1 // A rotateYZ4D(speed#) endif if GetRawKeyState(68)=1 // D rotateYZ4D(-speed#) endif if GetRawKeyState(32)=1 // Space PI#=0 endif if GetRawKeyState(27)=1 // ESC exit endif if pi#<-360 then pi#=-360 if pi#>360 then pi#=360 endfunction function drawvertices# (x#,y#,sx#,sy#) for i=0 to 16 p1# = persp# / (vertices#[i,2] + persp#) p2# = persp# / (vertices#[i,3] + persp#) DrawEllipse(vertices#[i,0]*p1#*p2#+x# , vertices#[i,1]*p1#*p2#+y# , 1.5*p1#*p2#*6 , 1.5*p1#*p2#*6, makecolor(255,255,255), makecolor(0,0,255),1) next endfunction function drawFaces (x#,y#,sx#,sy#) col=0 for i=0 to faces.length vertex1#[0] = vertices#[faces[i,0],0] vertex1#[1] = vertices#[faces[i,0],1] vertex1#[2] = vertices#[faces[i,0],2] vertex1#[3] = vertices#[faces[i,0],3] vertex2#[0] = vertices#[faces[i,1],0] vertex2#[1] = vertices#[faces[i,1],1] vertex2#[2] = vertices#[faces[i,1],2] vertex2#[3] = vertices#[faces[i,1],3] vertex3#[0] = vertices#[faces[i,2],0] vertex3#[1] = vertices#[faces[i,2],1] vertex3#[2] = vertices#[faces[i,2],2] vertex3#[3] = vertices#[faces[i,2],3] vertex4#[0] = vertices#[faces[i,3],0] vertex4#[1] = vertices#[faces[i,3],1] vertex4#[2] = vertices#[faces[i,3],2] vertex4#[3] = vertices#[faces[i,3],3] p1# = persp# / (vertices#[faces[i,0],3] + persp#) p2# = persp# / (vertices#[faces[i,1],3] + persp#) p3# = persp# / (vertices#[faces[i,2],3] + persp#) p4# = persp# / (vertices#[faces[i,3],3] + persp#) p5# = persp# / (vertices#[faces[i,0],2] + persp#) p6# = persp# / (vertices#[faces[i,1],2] + persp#) p7# = persp# / (vertices#[faces[i,2],2] + persp#) p8# = persp# / (vertices#[faces[i,3],2] + persp#) col=0 if i>0 then col=makecolor(0,255,255) if i>6 then col=makecolor(0,0,255) if i>12 then col=makecolor(255,0,255) if i>18 then col=makecolor(255,0,0) if i>24 then col=makecolor(255,255,0) if GetRawKeyPressed(32)=1 and i>24 then col=makecolor(0,0,0) for vv=1 to 5 drawline(vertex1#[0] * p1#*p5#+x#+vv, vertex1#[1] * p1#*p5#+y#+vv,vertex2#[0] * p2#*p6#+x#+vv, vertex2#[1] * p2#*p6#+y#+vv, col,col) drawline(vertex3#[0] * p3#*p7#+x#+vv, vertex3#[1] * p3#*p7#+y#+vv,vertex4#[0] * p4#*p8#+x#+vv, vertex4#[1] * p4#*p8#+y#+vv, col,col) next next endfunction function rotateXZ4D (angle# as float) ct# = cos(angle#) st# = sin(angle#) for i = 0 to 16 x# = vertices#[i,0] y# = vertices#[i,1] z# = vertices#[i,2] w# = vertices#[i,3] vertices#[i,0] = x# vertices#[i,1] = ct#*y# - st#*w# vertices#[i,2] = z# vertices#[i,3] = ct#*w# + st#*y# next endfunction function rotateXW4D(angle# as float) ct# = cos(angle#) st# = sin(angle#) for i = 0 to 16 x# = vertices#[i,0] y# = vertices#[i,1] z# = vertices#[i,2] w# = vertices#[i,3] vertices#[i,0]=x# vertices#[i,1]= ct#*y# - st#*z# vertices#[i,2]=st#*y# + ct#*z# vertices#[i,3]=w# next endfunction function rotateYZ4D (angle# as float) ct# = cos(angle#) st# = sin(angle#) for i = 0 to 16 x# = vertices#[i,0] y# = vertices#[i,1] z# = vertices#[i,2] w# = vertices#[i,3] vertices#[i,0] = ct#*x# - st#*w# vertices#[i,1] = y# vertices#[i,2] = z# vertices#[i,3] = ct#*w# + st#*x# next endfunction function rotateYW4D (angle# as float) ct# = cos(angle#) st# = sin(angle#) for i = 0 to 16 x# = vertices#[i,0] y# = vertices#[i,1] z# = vertices#[i,2] w# = vertices#[i,3] vertices#[i,0] = ct#*x# + st#*z# vertices#[i,1] = y# vertices#[i,2] = -st#*x# + ct#*z# vertices#[i,3] =w# next endfunction function setupvertices#() PI#=0 vertices#[0,0] = -l# : vertices#[0,1] = -l# : vertices#[0,2] = -l# : vertices#[0,3] = l# vertices#[1,0] = -l# : vertices#[1,1] = -l# : vertices#[1,2] = l# : vertices#[1,3] = l# vertices#[2,0] = -l# : vertices#[2,1] = l# : vertices#[2,2] = -l# : vertices#[2,3] = l# vertices#[3,0] = -l# : vertices#[3,1] = l# : vertices#[3,2] = l# : vertices#[3,3] = l# vertices#[4,0] = l# : vertices#[4,1] = -l# : vertices#[4,2] = -l# : vertices#[4,3] = l# vertices#[5,0] = l# : vertices#[5,1] = -l# : vertices#[5,2] = l# : vertices#[5,3] = l# vertices#[6,0] = l# : vertices#[6,1] = l# : vertices#[6,2] = -l# : vertices#[6,3] = l# vertices#[7,0] = l# : vertices#[7,1] = l# : vertices#[7,2] = l# : vertices#[7,3] = l# vertices#[8,0] = -l# : vertices#[8,1] = -l# : vertices#[8,2] = -l# : vertices#[8,3] = -l# vertices#[9,0] = -l# : vertices#[9,1] = -l# : vertices#[9,2] = l# : vertices#[9,3] = -l# vertices#[10,0] = -l# : vertices#[10,1] = l# : vertices#[10,2] = -l# : vertices#[10,3] = -l# vertices#[11,0] = -l# : vertices#[11,1] = l# : vertices#[11,2] = l# : vertices#[11,3] = -l# vertices#[12,0] = l# : vertices#[12,1] = -l# : vertices#[12,2] = -l# : vertices#[12,3] = -l# vertices#[13,0] = l# : vertices#[13,1] = -l# : vertices#[13,2] = l# : vertices#[13,3] = -l# vertices#[14,0] = l# : vertices#[14,1] = l# : vertices#[14,2] = -l# : vertices#[14,3] = -l# vertices#[15,0] = l# : vertices#[15,1] = l# : vertices#[15,2] = l# : vertices#[15,3] = -l# faces[0,0] = 0 : faces[0,1] = 1 : faces[0,2] = 3 : faces[0,3] = 2 faces[1,0] = 0 : faces[1,1] = 2 : faces[1,2] = 6 : faces[1,3] = 4 faces[2,0] = 0 : faces[2,1] = 1 : faces[2,2] = 5 : faces[2,3] = 4 faces[3,0] = 2 : faces[3,1] = 3 : faces[3,2] = 7 : faces[3,3] = 6 faces[4,0] = 4 : faces[4,1] = 5 : faces[4,2] = 7 : faces[4,3] = 6 faces[5,0] = 1 : faces[5,1] = 3 : faces[5,2] = 7 : faces[5,3] = 5 faces[6,0] = 8 : faces[6,1] = 9 : faces[6,2] = 13 : faces[6,3] = 12 faces[7,0] = 8 : faces[7,1] = 10 : faces[7,2] = 14 : faces[7,3] = 12 faces[8,0] = 8 : faces[8,1] = 9 : faces[8,2] = 11 : faces[8,3] = 10 faces[9,0] = 10 : faces[9,1] = 11 : faces[9,2] = 15 : faces[9,3] = 14 faces[10,0] = 9 : faces[10,1] = 11 : faces[10,2] = 15 : faces[10,3] = 13 faces[11,0] = 12 : faces[11,1] = 13 : faces[11,2] = 15 : faces[11,3] = 14 faces[12,0] = 2 : faces[12,1] = 3 : faces[12,2] = 11 : faces[12,3] = 10 faces[13,0] = 6 : faces[13,1] = 7 : faces[13,2] = 15 : faces[13,3] = 14 faces[14,0] = 2 : faces[14,1] = 6 : faces[14,2] = 14 : faces[14,3] = 10 faces[15,0] = 3 : faces[15,1] = 7 : faces[15,2] = 15 : faces[15,3] = 11 faces[16,0] = 0 : faces[16,1] = 1 : faces[16,2] = 9 : faces[16,3] = 8 faces[17,0] = 4 : faces[17,1] = 5 : faces[17,2] = 13 : faces[17,3] = 12 faces[18,0] = 1 : faces[18,1] = 5 : faces[18,2] = 13 : faces[18,3] = 9 faces[19,0] = 0 : faces[19,1] = 4 : faces[19,2] = 12 : faces[19,3] = 8 faces[20,0] = 4 : faces[20,1] = 6 : faces[20,2] = 14 : faces[20,3] = 12 faces[21,0] = 0 : faces[21,1] = 2 : faces[21,2] = 10 : faces[21,3] = 8 faces[22,0] = 5 : faces[22,1] = 7 : faces[22,2] = 15 : faces[22,3] = 13 faces[23,0] = 1 : faces[23,1] = 3 : faces[23,2] = 11 : faces[23,3] = 9 //Intersections between the 2 cubes faces[24,0] = 1 : faces[24,1] = 9 faces[25,0] = 2 : faces[25,1] = 10 faces[26,0] = 3 : faces[26,1] = 11 faces[27,0] = 4 : faces[27,1] = 12 faces[28,0] = 5 : faces[28,1] = 13 faces[29,0] = 6 : faces[29,1] = 14 faces[30,0] = 7 : faces[30,1] = 15 faces[31,0] = 8 : faces[31,1] = 0 endfunction