
/*
 * Java Rubik's Cube
 * -----------------
 *
 * Copyright 1996, Song Li  
 * URL: www.cs.umbc.edu/~sli2
 *
 * 
 * You can use the code for any nonprofittable use. But remember to mention
 * the authors' names in your revised program. You are also encouraged to
 * improve the program or give your comments and bug reports. If there are
 * further questions, please contact me and I'll be glad to help. My E-Mail
 * address is: sli2@gl.umbc.edu.
 *
 */



import java.awt.Color ;



class CubeMap {

    Color ColorMap [] [] [] = new Color [6] [3] [3] ;
    
    
    final static int XPlane = 0 ;
    final static int YPlane = 1 ;
    final static int ZPlane = 2 ;
    
    
    private final Color ColorList [] = {
        Color.green,
        Color.red,
        Color.pink,
        Color.blue,
        Color.white,
        Color.yellow } ;
    
    
    CubeMap () {
        Reset () ;
    }
    
    

    public void Reset () {
        for (int face=0; face<6; face++)
            for (int h=0; h<3; h++)
                for (int w=0; w<3; w++)
                    ColorMap [face] [h] [w] = ColorList [face] ;
    }

    
    private final int SpinMap [] [] = {
        {4, 2, 5, 3} ,
        {0, 4, 1, 5} ,
        {2, 0, 3, 1} } ;
    
    
    
    void Spin (int axis, int plane, boolean counterclock) {
        if (counterclock)
            SpinCounterclock (axis, plane) ;
        else 
            SpinClock (axis, plane) ;
    }
    
    
    
    private void SpinCounterclock (int axis, int plane) {
        Color color0 = ColorMap [SpinMap[axis][0]] [0] [plane] ;
        Color color1 = ColorMap [SpinMap[axis][0]] [1] [plane] ;
        Color color2 = ColorMap [SpinMap[axis][0]] [2] [plane] ;
        
        ColorMap [SpinMap[axis][0]] [0] [plane] = ColorMap [SpinMap[axis][1]] [plane] [2];
        ColorMap [SpinMap[axis][0]] [1] [plane] = ColorMap [SpinMap[axis][1]] [plane] [1];
        ColorMap [SpinMap[axis][0]] [2] [plane] = ColorMap [SpinMap[axis][1]] [plane] [0];

        ColorMap [SpinMap[axis][1]] [plane] [0] = ColorMap [SpinMap[axis][2]] [0] [plane];
        ColorMap [SpinMap[axis][1]] [plane] [1] = ColorMap [SpinMap[axis][2]] [1] [plane];
        ColorMap [SpinMap[axis][1]] [plane] [2] = ColorMap [SpinMap[axis][2]] [2] [plane];

        ColorMap [SpinMap[axis][2]] [0] [plane] = ColorMap [SpinMap[axis][3]] [plane] [2];
        ColorMap [SpinMap[axis][2]] [1] [plane] = ColorMap [SpinMap[axis][3]] [plane] [1];
        ColorMap [SpinMap[axis][2]] [2] [plane] = ColorMap [SpinMap[axis][3]] [plane] [0];

        ColorMap [SpinMap[axis][3]] [plane] [0] = color0 ;
        ColorMap [SpinMap[axis][3]] [plane] [1] = color1 ;
        ColorMap [SpinMap[axis][3]] [plane] [2] = color2 ;

        
        if (plane == 1)
            return ;
        
        int face = (plane==0) ? axis*2 : axis*2+1 ;
        
        Color tempcolor  = ColorMap [face][0][0] ;
        ColorMap [face][0][0] = ColorMap [face][2][0] ;
        ColorMap [face][2][0] = ColorMap [face][2][2] ;
        ColorMap [face][2][2] = ColorMap [face][0][2] ;
        ColorMap [face][0][2] = tempcolor ;
        
        tempcolor = ColorMap [face][0][1] ;
        ColorMap [face][0][1] = ColorMap [face][1][0] ;
        ColorMap [face][1][0] = ColorMap [face][2][1] ;
        ColorMap [face][2][1] = ColorMap [face][1][2] ;
        ColorMap [face][1][2] = tempcolor ;
    }        







    private void SpinClock (int axis, int plane) {
        Color color0 = ColorMap [SpinMap[axis][0]] [0] [plane] ;
        Color color1 = ColorMap [SpinMap[axis][0]] [1] [plane] ;
        Color color2 = ColorMap [SpinMap[axis][0]] [2] [plane] ;
        
        ColorMap [SpinMap[axis][0]] [0] [plane] = ColorMap [SpinMap[axis][3]] [plane] [0];
        ColorMap [SpinMap[axis][0]] [1] [plane] = ColorMap [SpinMap[axis][3]] [plane] [1];
        ColorMap [SpinMap[axis][0]] [2] [plane] = ColorMap [SpinMap[axis][3]] [plane] [2];

        ColorMap [SpinMap[axis][3]] [plane] [0] = ColorMap [SpinMap[axis][2]] [2] [plane];
        ColorMap [SpinMap[axis][3]] [plane] [1] = ColorMap [SpinMap[axis][2]] [1] [plane];
        ColorMap [SpinMap[axis][3]] [plane] [2] = ColorMap [SpinMap[axis][2]] [0] [plane];

        ColorMap [SpinMap[axis][2]] [0] [plane] = ColorMap [SpinMap[axis][1]] [plane] [0];
        ColorMap [SpinMap[axis][2]] [1] [plane] = ColorMap [SpinMap[axis][1]] [plane] [1];
        ColorMap [SpinMap[axis][2]] [2] [plane] = ColorMap [SpinMap[axis][1]] [plane] [2];

        ColorMap [SpinMap[axis][1]] [plane] [0] = color2 ;
        ColorMap [SpinMap[axis][1]] [plane] [1] = color1 ;
        ColorMap [SpinMap[axis][1]] [plane] [2] = color0 ;

        
        if (plane == 1)
            return ;
        
        int face = (plane==0) ? axis*2 : axis*2+1 ;
        
        Color tempcolor  = ColorMap [face][0][0] ;
        ColorMap [face][0][0] = ColorMap [face][0][2] ;
        ColorMap [face][0][2] = ColorMap [face][2][2] ;
        ColorMap [face][2][2] = ColorMap [face][2][0] ;
        ColorMap [face][2][0] = tempcolor ;
        
        tempcolor = ColorMap [face][0][1] ;
        ColorMap [face][0][1] = ColorMap [face][1][2] ;
        ColorMap [face][1][2] = ColorMap [face][2][1] ;
        ColorMap [face][2][1] = ColorMap [face][1][0] ;
        ColorMap [face][1][0] = tempcolor ;
    }

}


