To rotate "slices" :
Left mouse button and drag in required direction.
Drag for approximately half a cube.
The mouse must remain in the boundaries of the selected "slice"
To rotate whole cube :
Right mouse button and drag in required direction.
Drag for approximately half a cube.
Again, the mouse must remain in the boundaries of the selected "slice" of that face.
Edit to reduce CPU usage now done.
Code: Select all
' 3D Cube by 3622
screen 19, 32, 2
windowtitle "FreeBASIC Rubik's Cube"
randomize
const green = rgb (0, 255, 0)
const blue = rgb (0, 0, 255)
const white = rgb (255, 255, 255)
const yellow = rgb (255, 255, 0)
const red = rgb (255, 0, 0)
const orange = rgb (255, 165, 0)
const trueblack = rgb (0, 0, 0)
const black = rgb (20, 20, 20)
const offx = 399
const offy = 299
const ta = 34
const scale = 1.5
const rad = 0.0174532
const origin = 1500
const screen_distance = 3000
type p2d
x as single
y as single
end type
dim as p2d m_slice(17, 3)
type coord
x(3) as single
y(3) as single
z(3) as single
colour as ulong
end type
dim as coord sq(53), sq_p(53), master(53), start(53)
dim as single vis(53)
dim as integer cube(53), z_1(20), z_2(11), z_3(20), x_1(20), x_2(11), x_3(20), y_1(20), y_2(11), y_3(20)
dim as string slice(17)
dim as integer i, j, k, l, b, c
dim as integer res, mx, my, mbuttons, fx ,fy
dim as string quit
dim as ulong colour
dim as single x, p, q
' Front
data -32, -32, 32, -12, -32, 32, -12, -12, 32, -32, - 12, 32
data -10, -32, 32, 10, -32, 32, 10, -12, 32, -10, -12, 32
data 12, -32, 32, 32, -32, 32, 32, -12, 32, 12, -12, 32
data -32, -10, 32, -12, -10, 32, -12, 10, 32, -32, 10, 32
data -10, -10, 32, 10, -10, 32, 10, 10, 32, -10, 10, 32
data 12, -10, 32, 32, -10, 32, 32, 10, 32, 12, 10, 32
data -32, 12, 32, -12, 12, 32, -12, 32, 32, -32, 32, 32
data -10, 12, 32, 10, 12, 32, 10, 32, 32, -10, 32, 32
data 12, 12, 32, 32, 12, 32, 32, 32, 32, 12, 32, 32
' z_1
data 0, 1 ,2, 3, 4, 5, 6, 7, 8
data 11, 14, 17, 45, 46, 47, 33, 30, 27, 44, 43, 42
' z_2
data 10, 13, 16, 48, 49, 50, 34, 31, 28, 41, 40, 39
' z_3
data 18, 19, 20, 21, 22, 23, 24, 25, 26
data 9, 12, 15, 51, 52, 53, 35, 32, 29, 38, 37, 36
' x_1
data 9, 10, 11, 12, 13, 14, 15, 16, 17
data 0, 3, 6, 45, 48, 51, 26, 23, 20, 36, 39, 42
' x_2
data 1, 4, 7, 46, 49, 52, 25, 22, 19, 37, 40, 43
' x_3
data 27, 28, 29, 30, 31, 32, 33, 34, 35
data 2, 5, 8, 47, 50, 53, 24, 21, 18, 38, 41, 44
' y_1
data 36, 37, 38, 39, 40, 41, 42, 43, 44
data 0, 1, 2, 9, 10, 11, 18, 19, 20, 27, 28, 29
' y_2
data 3, 4, 5, 12, 13, 14, 21, 22, 23,30, 31, 32
' y_3
data 45, 46, 47, 48, 49, 50, 51, 52, 53
data 6, 7, 8, 15, 16, 17, 24, 25, 26, 33, 34, 35
' slice
data "x1+", "x2+", "x3+", "y1+", "y2+", "y3+", "z1+", "z2+", "z3+"
data "x1-", "x2-", "x3-", "y1-", "y2-", "y3-", "z1-", "z2-", "z3-"
' mouse slice
data 0, 0, 0, 1, 6, 2, 6, 3
data 1, 0, 1, 1, 7, 2, 7, 3
data 2, 0, 2, 1, 8, 2, 8, 3
data 0, 3, 0, 0, 2, 1, 2, 2
data 3, 3, 3, 0, 5, 1, 5, 2
data 6, 3, 6, 0, 8, 1, 8, 2
for i = 0 to 8
for j = 0 to 3
read sq(i).x(j)
read sq(i).y(j)
read sq(i).z(j)
next
next
x = rad * 90
for k = 1 to 3
for i = 0 to 8
for j = 0 to 3
b = sq(i).x(j)
c = sq(i).z(j)
sq(i + (9 * k)).x(j) = b * cos(x * k) - c * sin(x * k)
sq(i + (9 * k)).z(j) = b * sin(x * k) + c * cos(x * k)
sq(i + (9 * k)).y(j) = sq(i).y(j)
next
next
next
x = rad * 90
for i = 0 to 8
for j = 0 to 3
b = sq(i).y(j)
c = sq(i).z(j)
sq(i + (9 * 4)).y(j) = b * cos(x) - c * sin(x)
sq(i + (9 * 4)).z(j) = b * sin(x) + c * cos(x)
sq(i + (9 * 4)).x(j) = sq(i).x(j)
next
next
x = -rad * 90
for i = 0 to 8
for j = 0 to 3
b = sq(i).y(j)
c = sq(i).z(j)
sq(i + (9 * 5)).y(j) = b * cos(x) - c * sin(x)
sq(i + (9 * 5)).z(j) = b * sin(x) + c * cos(x)
sq(i + (9 * 5)).x(j) = sq(i).x(j)
next
next
for i = 0 to 53
select case i
case 0 to 8
sq(i).colour = green
case 9 to 17
sq(i).colour = white
case 18 to 26
sq(i).colour = blue
case 27 to 35
sq(i).colour = yellow
case 36 to 44
sq(i).colour = red
case 45 to 53
sq(i).colour = orange
end select
cube(i) = i
next
for i = 0 to 20
read z_1(i)
next
for i = 0 to 11
read z_2(i)
next
for i = 0 to 20
read z_3(i)
next
for i = 0 to 20
read x_1(i)
next
for i = 0 to 11
read x_2(i)
next
for i = 0 to 20
read x_3(i)
next
for i = 0 to 20
read y_1(i)
next
for i = 0 to 11
read y_2(i)
next
for i = 0 to 20
read y_3(i)
next
for i = 0 to 17
read slice(i)
next
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub backdrop()
dim as integer i, j
line (20, 320) - step (61, 24), black, bf
draw string (26, 326), "Shuff", trueblack
draw string (63, 326), "le", trueblack
for i = 20 to 81
for j = 320 to 344
line ((i - 20) * 2 + 20, (j - 320) * 2 + 20) - step (2, 2),point(i, j), bf
next
next
line (20, 320) - step (61, 24), black, bf
draw string (32, 326), "Reset", trueblack
for i = 20 to 81
for j = 320 to 344
line ((i - 20) * 2 + 20, (j - 320) * 2 + 90) - step (2, 2),point(i, j), bf
next
next
/'
line (20, 320) - step (61, 24), black, bf
draw string (34, 326), "So", trueblack
draw string (48, 326), "l", trueblack
draw string (54, 326), "ve", trueblack
for i = 20 to 81
for j = 320 to 344
line ((i - 20) * 2 + 20, (j - 320) * 2 + 160) - step (2, 2),point(i, j), bf
next
next
'/
line (20, 320) - step (61, 24), trueblack, bf
screencopy (0, 1)
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub display(sq_p() as coord, vis() as single)
dim as integer i, j
screenlock()
screencopy (1, 0)
for i = 0 to 53
if vis(i) <= 0.04 then continue for
for j = 0 to 2
line (scale * (sq_p(i).x(j)) + offx, scale * (sq_p(i).y(j)) + offy) - (scale * (sq_p(i).x(j + 1)) + offx, scale * (sq_p(i).y(j + 1)) + offy), sq_p(i).colour
next
line (scale * (sq_p(i).x(3)) + offx, (scale * sq_p(i).y(3)) + offy) - (scale * (sq_p(i).x(0)) + offx, scale * (sq_p(i).y(0)) + offy), sq_p(i).colour
paint (scale * ((sq_p(i).x(0) + sq_p(i).x(2)) / 2) + offx, scale * ((sq_p(i).y(1) + sq_p(i).y(3)) / 2) + offy), sq_p(i).colour
next
screenunlock()
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub rotate_x(sq() as coord, x as single, z() as integer)
dim as integer i, j, k
dim as single b, c
for i = lbound(z) to ubound(z)
k = z(i)
for j = 0 to 3
b = sq(k).y(j)
c = sq(k).z(j)
sq(k).y(j) = b * cos(x) - c * sin(x)
sq(k).z(j) = b * sin(x) + c * cos(x)
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub rotate_y(sq() as coord, x as single, z() as integer)
dim as integer i, j, k
dim as single b, c
for i = lbound(z) to ubound(z)
k = z(i)
for j = 0 to 3
b = sq(k).x(j)
c = sq(k).z(j)
sq(k).x(j) = b * cos(x) - c * sin(x)
sq(k).z(j) = b * sin(x) + c * cos(x)
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub rotate_z(sq() as coord, x as single, z() as integer)
dim as integer i, j, k
dim as single b, c
for i = lbound(z) to ubound(z)
k = z(i)
for j = 0 to 3
b = sq(k).x(j)
c = sq(k).y(j)
sq(k).x(j) = b * cos(x) - c * sin(x)
sq(k).y(j) = b * sin(x) + c * cos(x)
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
function get_vis (sq_p() as coord, l as integer) as single
dim as single a, b, c, d, e, f, x1, y1, z1, x2, y2, z2
x1 = sq_p(l).x(1) - sq_p(l).x(0)
y1 = sq_p(l).y(1) - sq_p(l).y(0)
z1 = sq_p(l).z(1) - sq_p(l).z(0)
x2 = sq_p(l).x(3) - sq_p(l).x(0)
y2 = sq_p(l).y(3) - sq_p(l).y(0)
z2 = sq_p(l).z(3) - sq_p(l).z(0)
a = y1 * z2 - z1 * y2
b = z1 * x2 - x1 * z2
c = x1 * y2 - y1 * x2
d = 0
e = 0
f = 3000
return (a * d + b * e + c * f) / ((sqr(a * a + b * b + c * c) * (sqr(d * d + e * e + f * f))))
end function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub y_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)
dim as integer i, j, k
dim as single a
for k = 0 to 44
a = 1 * rad
rotate_x(sq(), ta * a, slice())
rotate_y(sq(), 45 * -a, slice())
rotate_y(sq(), d * a, slice())
rotate_y(sq(), d * a, slice())
rotate_y(sq(), 45 * a, slice())
rotate_x(sq(), ta * -a, slice())
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub x_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)
dim as integer i, j, k
dim as single a
for k = 0 to 44
a = 1 * rad
rotate_x(sq(), ta * a, slice())
rotate_y(sq(), 45 * -a, slice())
rotate_x(sq(), d * a, slice())
rotate_x(sq(), d * a, slice())
rotate_y(sq(), 45 * a, slice())
rotate_x(sq(), ta * -a, slice())
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub z_(sq() as coord, sq_p() as coord, slice() as integer, vis() as single, d as integer)
dim as integer i, j, k
dim as single a
for k = 0 to 44
a = 1 * rad
rotate_x(sq(), ta * a, slice())
rotate_y(sq(), 45 * -a, slice())
rotate_z(sq(), d * a, slice())
rotate_z(sq(), d * a, slice())
rotate_y(sq(), 45 * a, slice())
rotate_x(sq(), ta * -a, slice())
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub anti_clockwise(sq() as coord, master() as coord, sl() as integer)
dim as integer i, j, count
dim as integer temp(2, 2)
for i = 0 to 2
for j = 0 to 2
temp(i, j) = sl(count)
count += 1
next
next
count = 0
for j = 0 to 2
for i = 2 to 0 step -1
master(temp(i, j)).colour = sq(sl(count)).colour
count += 1
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub clockwise(sq() as coord, master() as coord, sl() as integer)
dim as integer i, j, count
dim as integer temp(2, 2)
for i = 0 to 2
for j = 0 to 2
temp(i, j) = sl(count)
count += 1
next
next
count = 0
for j = 2 to 0 step -1
for i = 0 to 2
master(temp(i, j)).colour = sq(sl(count)).colour
count += 1
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
sub shuffle(sq() as coord, sq_p() as coord, master() as coord, vis() as single, x_1() as integer, x_2() as integer, x_3() as integer, _
y_1() as integer, y_2() as integer, y_3() as integer, z_1() as integer, z_2() as integer, z_3() as integer, slice() as string)
dim as integer i, j, k, rand, oldrand
for j = 0 to 30
do
rand = int(rnd * 18)
loop while (abs(rand - oldrand) = 9)
oldrand = rand
select case slice(rand)
case "y1+"
y_(sq(), sq_p(), y_1(), vis(), 1)
for i = 12 to 20
master(y_1(i)).colour = sq(y_1(i - 3)).colour
next
for i = 9 to 11
master(y_1(i)).colour = sq(y_1(i + 9)).colour
next
' c
clockwise(sq(), master(), y_1())
case "y2+"
y_(sq(), sq_p(), y_2(), vis(), 1)
for i = 3 to 11
master(y_2(i)).colour = sq(y_2(i - 3)).colour
next
for i = 0 to 2
master(y_2(i)).colour = sq(y_2(i + 9)).colour
next
case "y3+"
y_(sq(), sq_p(), y_3(), vis(), 1)
for i = 12 to 20
master(y_3(i)).colour = sq(y_3(i - 3)).colour
next
for i = 9 to 11
master(y_3(i)).colour = sq(y_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_3())
case "z1-"
z_(sq(), sq_p(), z_1(), vis(), -1)
for i =12 to 20
master(z_1(i)).colour = sq(z_1(i - 3)).colour
next
for i = 9 to 11
master(z_1(i)).colour = sq(z_1(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_1())
case "x1-"
x_(sq(), sq_p(), x_1(), vis(), -1)
for i = 12 to 20
master(x_1(i)).colour = sq(x_1(i - 3)).colour
next
for i = 9 to 11
master(x_1(i)).colour = sq(x_1(i + 9)).colour
next
' c
clockwise(sq(), master(), x_1())
case "z2-"
z_(sq(), sq_p(), z_2(), vis(), -1)
for i = 3 to 11
master(z_2(i)).colour = sq(z_2(i - 3)).colour
next
for i = 0 to 2
master(z_2(i)).colour = sq(z_2(i + 9)).colour
next
case "x2-"
x_(sq(), sq_p(), x_2(), vis(), -1)
for i = 3 to 11
master(x_2(i)).colour = sq(x_2(i - 3)).colour
next
for i = 0 to 2
master(x_2(i)).colour = sq(x_2(i + 9)).colour
next
case "z3-"
z_(sq(), sq_p(), z_3(), vis(), -1)
for i = 12 to 20
master(z_3(i)).colour = sq(z_3(i - 3)).colour
next
for i = 9 to 11
master(z_3(i)).colour = sq(z_3(i + 9)).colour
next
' c
clockwise(sq(), master(), z_3())
case "x3-"
x_(sq(), sq_p(), x_3(), vis(), -1)
for i = 12 to 20
master(x_3(i)).colour = sq(x_3(i - 3)).colour
next
for i = 9 to 11
master(x_3(i)).colour = sq(x_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_3())
case "x1+"
x_(sq(), sq_p(), x_1(), vis(), 1)
for i = 9 to 17
master(x_1(i)).colour = sq(x_1(i + 3)).colour
next
for i = 18 to 20
master(x_1(i)).colour = sq(x_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_1())
case "z1+"
z_(sq(), sq_p(), z_1(), vis(), 1)
for i = 9 to 17
master(z_1(i)).colour = sq(z_1(i + 3)).colour
next
for i = 18 to 20
master(z_1(i)).colour = sq(z_1(i - 9)).colour
next
'c
clockwise(sq(), master(), z_1())
case "x2+"
x_(sq(), sq_p(), x_2(), vis(), 1)
for i = 0 to 8
master(x_2(i)).colour = sq(x_2(i + 3)).colour
next
for i = 9 to 11
master(x_2(i)).colour = sq(x_2(i - 9)).colour
next
case "z2+"
z_(sq(), sq_p(), z_2(), vis(), 1)
for i = 0 to 8
master(z_2(i)).colour = sq(z_2(i + 3)).colour
next
for i = 9 to 11
master(z_2(i)).colour = sq(z_2(i - 9)).colour
next
case "x3+"
x_(sq(), sq_p(), x_3(), vis(), 1)
for i = 9 to 17
master(x_3(i)).colour = sq(x_3(i + 3)).colour
next
for i = 18 to 20
master(x_3(i)).colour = sq(x_3(i - 9)).colour
next
' c
clockwise(sq(), master(), x_3())
case "z3+"
z_(sq(), sq_p(), z_3(), vis(), 1)
for i = 9 to 17
master(z_3(i)).colour = sq(z_3(i + 3)).colour
next
for i = 18 to 20
master(z_3(i)).colour = sq(z_3(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_3())
case "y1-"
y_(sq(), sq_p(), y_1(), vis(), -1)
for i = 9 to 17
master(y_1(i)).colour = sq(y_1(i + 3)).colour
next
for i = 18 to 20
master(y_1(i)).colour = sq(y_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_1())
case "y2-"
y_(sq(), sq_p(), y_2(), vis(), -1)
for i = 0 to 8
master(y_2(i)).colour = sq(y_2(i + 3)).colour
next
for i = 9 to 11
master(y_2(i)).colour = sq(y_2(i - 9)).colour
next
case "y3-"
y_(sq(), sq_p(), y_3(), vis(), -1)
for i = 9 to 17
master(y_3(i)).colour = sq(y_3(i + 3)).colour
next
for i = 18 to 20
master(y_3(i)).colour = sq(y_3(i - 9)).colour
next
' c
clockwise(sq(), master(), y_3())
end select
for k = 0 to 53
sq(k) = master(k)
next
next
end sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copy and Pasted from Rosetta Code
function in_tri( A as p2d, B as p2d, C as p2d, P as p2d ) as boolean
'uses barycentric coordinates to determine if point P is inside
'the triangle defined by points A, B, C
dim as double AreaD = (-B.y*C.x + A.y*(-B.x + C.x) + A.x*(B.y - C.y) + B.x*C.y)
dim as double s = (A.y*C.x - A.x*C.y + (C.y - A.y)*P.x + (A.x - C.x)*P.y)/AreaD
dim as double t = (A.x*B.y - A.y*B.x + (A.y - B.y)*P.x + (B.x - A.x)*P.y)/AreaD
if s<=0 then return false
if t<=0 then return false
if s+t>=1 then return false
return true
end function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
function inside(m_slice() as p2d, i as integer, x as integer, y as integer) as integer
dim as p2d a, b, c, d, p
a.x = scale * (m_slice(i, 0).x) + offx
a.y = scale * (m_slice(i, 0).y) + offy
b.x = scale * (m_slice(i, 1).x) + offx
b.y = scale * (m_slice(i, 1).y) + offy
c.x = scale * (m_slice(i, 2).x) + offx
c.y = scale * (m_slice(i, 2).y) + offy
d.x = scale * (m_slice(i, 3).x) + offx
d.y = scale * (m_slice(i, 3).y) + offy
p.x = x
p.y = y
if in_tri(a, b, c, p) then return 1
if in_tri(c, d, a, p) then return 1
return 0
end function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' main
backdrop()
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
for k = 0 to 44
x = 1 * rad
rotate_y(sq(), x, cube())
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
for k = 1 to ta
x = -1 * rad
rotate_x(sq(), x, cube())
for i = 0 to 53
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
for k = 0 to 359
x = -1 * rad
rotate_y(sq(), x, cube())
for i =lbound(cube) to ubound(cube)
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = sq(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
sleep 10
next
for i = 0 to 5
for j = 0 to 3
read p, q
m_slice(i, j).x = sq_p(p).x(q)
m_slice(i, j).y = sq_p(p).y(q)
m_slice(i + 6, j).x = sq_p(p + 27).x(q)
m_slice(i + 6, j).y = sq_p(p + 27).y(q)
m_slice(i + 12, j).x = sq_p(p + 36).x(q)
m_slice(i + 12, j).y = sq_p(p + 36).y(q)
next
next
for i = 0 to 53
master(i) = sq(i)
start(i) = sq(i)
next
' mouse input loop
do
quit = inkey
if quit = chr(255) + "k" then end
res = getmouse(mx, my, , mbuttons)
if mbuttons = 1 then
do
getmouse(fx, fy, , mbuttons)
loop while mbuttons = 1
if fx > 19 and fx < 143 then
select case fy
case 20 to 68
shuffle(sq(), sq_p(), master(), vis(), x_1(), x_2(), x_3(), y_1(), y_2(), y_3(), z_1(), z_2(), z_3(), slice())
case 90 to 138
for i = 0 to 53
master(i) = start(i)
for j = 0 to 3
sq_p(i).x(j) = (sq(i).x(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).y(j) = (sq(i).y(j) * screen_distance / (origin - sq(i).z(j)))
sq_p(i).z(j) = (sq(i).z(j) * screen_distance / (origin - sq(i).z(j)))
next
sq_p(i).colour = start(i).colour
vis(i) = get_vis(sq_p(), i)
next
display(sq_p(), vis())
case 160 to 208
' solve
end select
end if
for j = 0 to 17
if inside(m_slice(), j, mx, my) and inside(m_slice(), j, fx, fy) then exit for
next
select case j
case 0, 12
if my - fy > 30 then
' x1+
x_(sq(), sq_p(), x_1(), vis(), 1)
for i = 9 to 17
master(x_1(i)).colour = sq(x_1(i + 3)).colour
next
for i = 18 to 20
master(x_1(i)).colour = sq(x_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_1())
end if
if fy - my > 30 then
' x1-
x_(sq(), sq_p(), x_1(), vis(), -1)
for i = 12 to 20
master(x_1(i)).colour = sq(x_1(i - 3)).colour
next
for i = 9 to 11
master(x_1(i)).colour = sq(x_1(i + 9)).colour
next
' c
clockwise(sq(), master(), x_1())
end if
case 1, 13
if my - fy > 30 then
' x2+
x_(sq(), sq_p(), x_2(), vis(), 1)
for i = 0 to 8
master(x_2(i)).colour = sq(x_2(i + 3)).colour
next
for i = 9 to 11
master(x_2(i)).colour = sq(x_2(i - 9)).colour
next
end if
if fy - my > 30 then
' x2-
x_(sq(), sq_p(), x_2(), vis(), -1)
for i = 3 to 11
master(x_2(i)).colour = sq(x_2(i - 3)).colour
next
for i = 0 to 2
master(x_2(i)).colour = sq(x_2(i + 9)).colour
next
end if
case 2, 14
if my - fy > 30 then
' x1+
x_(sq(), sq_p(), x_3(), vis(), 1)
for i = 9 to 17
master(x_3(i)).colour = sq(x_3(i + 3)).colour
next
for i = 18 to 20
master(x_3(i)).colour = sq(x_3(i - 9)).colour
next
' c
clockwise(sq(), master(), x_3())
end if
if fy - my > 30 then
' x1-
x_(sq(), sq_p(), x_3(), vis(), -1)
for i = 12 to 20
master(x_3(i)).colour = sq(x_3(i - 3)).colour
next
for i = 9 to 11
master(x_3(i)).colour = sq(x_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_3())
end if
case 3, 9
if mx - fx > 30 then
' y1+
y_(sq(), sq_p(), y_1(), vis(), 1)
for i = 12 to 20
master(y_1(i)).colour = sq(y_1(i - 3)).colour
next
for i = 9 to 11
master(y_1(i)).colour = sq(y_1(i + 9)).colour
next
' c
clockwise(sq(), master(), y_1())
end if
if fx - mx > 30 then
' y1-
y_(sq(), sq_p(), y_1(), vis(), -1)
for i = 9 to 17
master(y_1(i)).colour = sq(y_1(i + 3)).colour
next
for i = 18 to 20
master(y_1(i)).colour = sq(y_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_1())
end if
case 4, 10
if mx - fx > 30 then
' y1+
y_(sq(), sq_p(), y_2(), vis(), 1)
for i = 3 to 11
master(y_2(i)).colour = sq(y_2(i - 3)).colour
next
for i = 0 to 2
master(y_2(i)).colour = sq(y_2(i + 9)).colour
next
end if
if fx - mx > 30 then
' y1-
y_(sq(), sq_p(), y_2(), vis(), -1)
for i = 0 to 8
master(y_2(i)).colour = sq(y_2(i + 3)).colour
next
for i = 9 to 11
master(y_2(i)).colour = sq(y_2(i - 9)).colour
next
end if
case 5, 11
if mx - fx > 30 then
' y1+
y_(sq(), sq_p(), y_3(), vis(), 1)
for i = 12 to 20
master(y_3(i)).colour = sq(y_3(i - 3)).colour
next
for i = 9 to 11
master(y_3(i)).colour = sq(y_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_3())
end if
if fx - mx > 30 then
' y1-
y_(sq(), sq_p(), y_3(), vis(), -1)
for i = 9 to 17
master(y_3(i)).colour = sq(y_3(i + 3)).colour
next
for i = 18 to 20
master(y_3(i)).colour = sq(y_3(i - 9)).colour
next
' c
clockwise(sq(), master(), y_3())
end if
case 6, 17
if my - fy > 30 then
' z1-
z_(sq(), sq_p(), z_1(), vis(), -1)
for i =12 to 20
master(z_1(i)).colour = sq(z_1(i - 3)).colour
next
for i = 9 to 11
master(z_1(i)).colour = sq(z_1(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_1())
end if
if fy - my > 30 then
' z1+
z_(sq(), sq_p(), z_1(), vis(), 1)
for i = 9 to 17
master(z_1(i)).colour = sq(z_1(i + 3)).colour
next
for i = 18 to 20
master(z_1(i)).colour = sq(z_1(i - 9)).colour
next
'c
clockwise(sq(), master(), z_1())
end if
case 7, 16
if my - fy > 30 then
' z2-
z_(sq(), sq_p(), z_2(), vis(), -1)
for i = 3 to 11
master(z_2(i)).colour = sq(z_2(i - 3)).colour
next
for i = 0 to 2
master(z_2(i)).colour = sq(z_2(i + 9)).colour
next
end if
if fy - my > 30 then
' z2+
z_(sq(), sq_p(), z_2(), vis(), 1)
for i = 0 to 8
master(z_2(i)).colour = sq(z_2(i + 3)).colour
next
for i = 9 to 11
master(z_2(i)).colour = sq(z_2(i - 9)).colour
next
end if
case 8, 15
if my - fy > 30 then
' z3-
z_(sq(), sq_p(), z_3(), vis(), -1)
for i = 12 to 20
master(z_3(i)).colour = sq(z_3(i - 3)).colour
next
for i = 9 to 11
master(z_3(i)).colour = sq(z_3(i + 9)).colour
next
' c
clockwise(sq(), master(), z_3())
end if
if fy - my > 30 then
' z3+
z_(sq(), sq_p(), z_3(), vis(), 1)
for i = 9 to 17
master(z_3(i)).colour = sq(z_3(i + 3)).colour
next
for i = 18 to 20
master(z_3(i)).colour = sq(z_3(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_3())
end if
end select
end if
if mbuttons = 2 then
do
getmouse(fx, fy, , mbuttons)
loop while mbuttons = 2
for j = 0 to 17
if inside(m_slice(), j, mx, my) and inside(m_slice(), j, fx, fy) then exit for
next
select case j
case 0 to 2, 12 to 14
if my - fy > 30 then
x_(sq(), sq_p(), cube(), vis(), 1)
for i = 9 to 17
master(x_1(i)).colour = sq(x_1(i + 3)).colour
next
for i = 18 to 20
master(x_1(i)).colour = sq(x_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_1())
for i = 0 to 8
master(x_2(i)).colour = sq(x_2(i + 3)).colour
next
for i = 9 to 11
master(x_2(i)).colour = sq(x_2(i - 9)).colour
next
for i = 9 to 17
master(x_3(i)).colour = sq(x_3(i + 3)).colour
next
for i = 18 to 20
master(x_3(i)).colour = sq(x_3(i - 9)).colour
next
' c
clockwise(sq(), master(), x_3())
end if
if fy - my > 30 then
x_(sq(), sq_p(), cube(), vis(), -1)
for i = 12 to 20
master(x_1(i)).colour = sq(x_1(i - 3)).colour
next
for i = 9 to 11
master(x_1(i)).colour = sq(x_1(i + 9)).colour
next
' c
clockwise(sq(), master(), x_1())
for i = 3 to 11
master(x_2(i)).colour = sq(x_2(i - 3)).colour
next
for i = 0 to 2
master(x_2(i)).colour = sq(x_2(i + 9)).colour
next
for i = 12 to 20
master(x_3(i)).colour = sq(x_3(i - 3)).colour
next
for i = 9 to 11
master(x_3(i)).colour = sq(x_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), x_3())
end if
case 6 to 8, 15 to 17
if my - fy > 30 then
z_(sq(), sq_p(), cube(), vis(), -1)
for i =12 to 20
master(z_1(i)).colour = sq(z_1(i - 3)).colour
next
for i = 9 to 11
master(z_1(i)).colour = sq(z_1(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_1())
for i = 3 to 11
master(z_2(i)).colour = sq(z_2(i - 3)).colour
next
for i = 0 to 2
master(z_2(i)).colour = sq(z_2(i + 9)).colour
next
for i = 12 to 20
master(z_3(i)).colour = sq(z_3(i - 3)).colour
next
for i = 9 to 11
master(z_3(i)).colour = sq(z_3(i + 9)).colour
next
' c
clockwise(sq(), master(), z_3())
end if
if fy - my > 30 then
z_(sq(), sq_p(), cube(), vis(), 1)
for i = 9 to 17
master(z_1(i)).colour = sq(z_1(i + 3)).colour
next
for i = 18 to 20
master(z_1(i)).colour = sq(z_1(i - 9)).colour
next
'c
clockwise(sq(), master(), z_1())
for i = 0 to 8
master(z_2(i)).colour = sq(z_2(i + 3)).colour
next
for i = 9 to 11
master(z_2(i)).colour = sq(z_2(i - 9)).colour
next
for i = 9 to 17
master(z_3(i)).colour = sq(z_3(i + 3)).colour
next
for i = 18 to 20
master(z_3(i)).colour = sq(z_3(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), z_3())
end if
case 3 to 5, 9 to 11
if mx - fx > 30 then
y_(sq(), sq_p(), cube(), vis(), 1)
for i = 12 to 20
master(y_1(i)).colour = sq(y_1(i - 3)).colour
next
for i = 9 to 11
master(y_1(i)).colour = sq(y_1(i + 9)).colour
next
' c
clockwise(sq(), master(), y_1())
for i = 3 to 11
master(y_2(i)).colour = sq(y_2(i - 3)).colour
next
for i = 0 to 2
master(y_2(i)).colour = sq(y_2(i + 9)).colour
next
for i = 12 to 20
master(y_3(i)).colour = sq(y_3(i - 3)).colour
next
for i = 9 to 11
master(y_3(i)).colour = sq(y_3(i + 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_3())
end if
if fx - mx > 30 then
y_(sq(), sq_p(), cube(), vis(), -1)
for i = 9 to 17
master(y_1(i)).colour = sq(y_1(i + 3)).colour
next
for i = 18 to 20
master(y_1(i)).colour = sq(y_1(i - 9)).colour
next
' ac
anti_clockwise(sq(), master(), y_1())
for i = 0 to 8
master(y_2(i)).colour = sq(y_2(i + 3)).colour
next
for i = 9 to 11
master(y_2(i)).colour = sq(y_2(i - 9)).colour
next
for i = 9 to 17
master(y_3(i)).colour = sq(y_3(i + 3)).colour
next
for i = 18 to 20
master(y_3(i)).colour = sq(y_3(i - 9)).colour
next
' c
clockwise(sq(), master(), y_3())
end if
end select
end if
for i = 0 to 53
sq(i) = master(i)
next
sleep 50
loop