goal: math of cube rotation
Here's a page that has a bunch on cube rotation:
http://www.euclideanspace.com/maths/discrete/groups/categorise/finite/cube/
Let's set up a coordinate system.
Set the cube at the origin. Look down Z at standard X (horizontal), Y
(vertical) plane (right-hand rule).
Let's unfold the cube into 2d
+--------+
| top |
+------+--------+-------+------+
| left | front | right | back |
+------+--------+-------+------+
| bottom |
+--------+
Let's store a cube as:
tlfrbm = 012345 = [ top, left, front, right, back, bottom]
Rotating clockwise about Z (twist from front) CLZ transforms to:
lmftbr
Rotating clockwise about Y (twist from top) CLY transforms to:
tfrblm
Rotating clockwise about X (twist from right) CLX transforms to:
flmrtb
Here's some python code that implements this:
################################
def rotate90( state, direction, axis ):
""">>>> Rotate a cube 90 degrees given:
Set the cube at the origin. Look down Z at standard X (horizontal), Y
(vertical) plane (right-hand rule).
Let's unfold the cube into 2d
+--------+
| top |
+------+--------+-------+------+
| left | front | right | back |
+------+--------+-------+------+
| bottom |
+--------+
Let's store a cube as:
tlfrbm = 012345 = [ top, left, front, right, back, bottom]
- state: string of length 6 = tlfrbm
- direction: = CL/CC = (CL)ockwise or (C)ounter(C)lockwise
- axis: = X/Y/Z in standard cube at the origin. Look down Z at
standard X (horizontal), Y (vertical) plane (right-hand rule).
<<<<
"""
defaultXform = "tlfrbm"
xformToIndex = dict( zip(defaultXform, range(len(defaultXform))))
# {'b': 4, 'f': 2, 'm': 5, 'l': 1, 'r': 3, 't': 0}
xform = "NotSet"
if direction=="CL" and axis=="Z":
# Rotating clockwise about Z (twist from front) CLZ transforms to:
xform = "lmftbr"
if direction=="CL" and axis=="Y":
# Rotating clockwise about Y (twist from top) CLY transforms to:
xform = "tfrblm"
if direction=="CL" and axis=="X":
# Rotating clockwise about X (twist from right) CLX transforms to:
xform = "flmrtb"
newstate = ["x"]*6
for ii in range(6):
newstate[ii] = state[ xformToIndex[xform[ii]] ]
return("".join(newstate))
################################
# Let's try to code out:
print rotate90("tlfrbm", "CL", "X")
# flmrtb
print rotate90("tlfrbm", "CL", "Y")
# tfrblm
print rotate90("tlfrbm", "CL", "Z")
# lmftbr
print rotate90("012345", "CL", "X")
# 215304
# four rotations should be the same
st = "tlfrbm"
for ii in range(4):
newst = rotate90(st, "CL", "X")
print "ii", ii, "st", st, "newst", newst
st = newst
output = """
ii 0 st tlfrbm newst flmrtb
ii 1 st flmrtb newst mlbrft
ii 2 st mlbrft newst bltrmf
ii 3 st bltrmf newst tlfrbm
Yes, back to original state for Clockwise rotation about X. left and
right are invariant.
"""
# how about X,Y,Z
print rotate90(rotate90(rotate90("tlfrbm", "CL", "X"), "CL", "Y"), "CL", "Z")
# mbrflt
# yes that's right!
################################