// TT4DPoint.java
 
/** 
 *
 * @author  Sean Bridges
 * @version 1.0
 *
 *  Represents a point in the 4 dimensional co-ordinate space.
 *  <x,y,z,w>, 0 <= x,y,z,w <= 2
 */
public class TT4DPoint
{

//----------------------------------------------
    //class variables
    
    //base 3, multipliers for x,y,z,w to turn it into an int, which is how 
    //the point is stored internally.
    private static final int dx = 1;
    private static final int dy = 3;
    private static final int dz = 9;
    private static final int dw = 27;

//----------------------------------------------
    //class methods
    public static void main(String[] args)
    {
        //a simple test.
        System.out.println(new TT4DPoint(0,0,0,0));
        System.out.println(new TT4DPoint(1,1,1,1));
        System.out.println(new TT4DPoint(1,2,1,2));
        System.out.println(new TT4DPoint(0,1,2,1));
    
    }


//----------------------------------------------
    //instance  variables

    private int value;

//----------------------------------------------
    //constructors

    /** Creates new TT4DPoint 
     * x,w,z,w must be between 0 and 2 inclusive.
     */
    public TT4DPoint(int x, int y, int z, int w) 
    {
        value = (x*dx) + (y*dy) + (z*dz) + (w*dw);
    }

    /**
     * Creates a new TT4DPoint from an integer.
     * Point must be of format x + 3y + 9z + 27w
     */
    public TT4DPoint(int value)
    {
        this.value = value;
    }

//----------------------------------------------
    //instance methods

    public int getX()
    {
        int x,y,z,w;
    
        int temp = value;
    
        w = temp / dw;
        temp = temp - (w*dw);
    
        z = temp / dz;
        temp = temp - (z*dz);
    
        y = temp / dy;
        temp = temp - (y*dy);
    
        x = temp / dx;
    
        return x;
    }
  
    public int getY()
    {
        int y,z,w;
    
        int temp = value;
    
        w = temp / dw;
        temp = temp - (w*dw);
    
        z = temp / dz;
        temp = temp - (z*dz);
    
        y = temp / dy;
    
        return y;
    }
  
    public int getZ()
    {
        int z,w;
    
        int temp = value;
    
        w = temp / dw;
        temp = temp - (w*dw);
    
        z = temp / dz;
     
        return z;
    }
  
    public int getW()
    {
        return value/dw;
    }
  
    /**
     * Returns the point as an int.
     * Value equals x + 3y + 9y + 27w
     */
    public int toInt()
    {
        return value;
    }

    /**
     * Returns the point as a string
     */
    public String toString()
    {
        int x,y,z,w;
    
        int temp = value;
    
        w = temp / dw;
        temp = temp - (w*dw);
    
        z = temp / dz;
        temp = temp - (z*dz);
    
        y = temp / dy;
        temp = temp - (y*dy);
    
        x = temp / dx;
    
        return "<" + x + ","
                + y + ","
                + z + ","
                + w + ">";
    }
  
}//end Class TT4DPoint