|
|
@ -1,3 +1,48 @@ |
|
|
|
module Datatypes.Cell where |
|
|
|
module Datatypes.Cell (Cell(..), rotateClockwise, rotateCounterclockwise ) where |
|
|
|
|
|
|
|
type Cell = (Int, Int) |
|
|
|
|
|
|
|
rotateClockwise :: Cell -> Cell -> Cell |
|
|
|
rotateClockwise pivot cell = let cubeCell = toCube cell |
|
|
|
cubePivot = toCube pivot |
|
|
|
cubeZero = cubeCell `cubeDiff` cubePivot |
|
|
|
rotatedZero = rotateCubeClockwise cubeZero |
|
|
|
rotatedCube = rotatedZero `cubeSum` cubePivot |
|
|
|
resultCell = fromCube rotatedCube |
|
|
|
in resultCell |
|
|
|
|
|
|
|
rotateCounterclockwise :: Cell -> Cell -> Cell |
|
|
|
rotateCounterclockwise pivot cell = let cubeCell = toCube cell |
|
|
|
cubePivot = toCube pivot |
|
|
|
cubeZero = cubeCell `cubeDiff` cubePivot |
|
|
|
rotatedZero = rotateCubeCounterclockwise cubeZero |
|
|
|
rotatedCube = rotatedZero `cubeSum` cubePivot |
|
|
|
resultCell = fromCube rotatedCube |
|
|
|
in resultCell |
|
|
|
|
|
|
|
-- PRIVATE |
|
|
|
|
|
|
|
type CubeCell = (Int, Int, Int) |
|
|
|
|
|
|
|
toCube :: Cell -> CubeCell |
|
|
|
toCube (x, y) = (xx, yy, zz) where |
|
|
|
xx = x - (y - (y `mod` 2)) `div` 2 |
|
|
|
zz = y |
|
|
|
yy = -(xx + zz) |
|
|
|
|
|
|
|
rotateCubeClockwise :: CubeCell -> CubeCell |
|
|
|
rotateCubeClockwise (xx, yy, zz) = (-zz, -xx, -yy) |
|
|
|
|
|
|
|
rotateCubeCounterclockwise :: CubeCell -> CubeCell |
|
|
|
rotateCubeCounterclockwise (xx, yy, zz) = (-yy, -zz, -xx) |
|
|
|
|
|
|
|
fromCube :: CubeCell -> Cell |
|
|
|
fromCube (xx, yy, zz) = (x, y) where |
|
|
|
x = xx + (zz - (zz `mod` 2)) `div` 2 |
|
|
|
y = zz |
|
|
|
|
|
|
|
cubeDiff :: CubeCell -> CubeCell -> CubeCell |
|
|
|
cubeDiff (x1, y1, z1) (x2, y2, z2) = (x1 - x2, y1 - y2, z1 - z2) |
|
|
|
|
|
|
|
cubeSum :: CubeCell -> CubeCell -> CubeCell |
|
|
|
cubeSum (x1, y1, z1) (x2, y2, z2) = (x1 + x2, y1 + y2, z1 + z2) |