public class Point3D {
    
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    // Member variables
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    ///////////////////////////////////////////////////////////////////
    // A Point3d is a 3D coordinate; an x, y, and z
    ///////////////////////////////////////////////////////////////////
    float x, y, z, w;
    
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    // Constructors
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    public Point3D() {
        ///////////////////////////////////////////////////////////////////
        // Initialize to origin
        ///////////////////////////////////////////////////////////////////
        x = (float) 0;
        y = (float) 0;
        z = (float) 0;
        w = (float) 1;
    }
    
    public Point3D(float x1, float y1, float z1) {
        ///////////////////////////////////////////////////////////////////
        // Initialize x=x1, y=y1, z=z1
        ///////////////////////////////////////////////////////////////////
        x = x1;
        y = y1;
        z = z1;
        w = (float) 1;
    }
    
    public void normalize() {
        ///////////////////////////////////////////////////////////////////
        // Normalize x, y, and z by w
        ///////////////////////////////////////////////////////////////////
        // For example:
        // +-  -+    +-   -+
        // | 12 |    |   6 |
        // | 13 | => | 6.5 |
        // |  6 |    |   3 |
        // |  2 |    |   1 |
        // +-  -+    +-   -+
        ///////////////////////////////////////////////////////////////////
        x = x/w;
        y = y/w;
        z = z/w;
        w = w/w;
    }
    
    public String toString() {
        ///////////////////////////////////////////////////////////////
        // Pretty prints current Point3D to a string
        ///////////////////////////////////////////////////////////////
        String str;
        int i;
        String x_str = (new Float(x)).toString();
        String y_str = (new Float(y)).toString();
        String z_str = (new Float(z)).toString();
        String w_str = (new Float(w)).toString();

        int col_max = x_str.length();
        int num = y_str.length();
        if ( num > col_max )
            col_max = num;
        num = z_str.length();
        if ( num > col_max )
            col_max = num;
        
        str = "+-";
        for (i = 1; i<=col_max; i++) {
            str += " ";
        }
        str += "-+\n";
        
        str += "| ";
        for (i = x_str.length(); i < col_max; i++) {
          str += " ";
        }
        str += x_str;
        str += " |\n";
        
        str += "| ";
        for (i = y_str.length(); i < col_max; i++) {
          str += " ";
        }
        str += y_str;
        str += " |\n";

        str += "| ";
        for (i = z_str.length(); i < col_max; i++) {
          str += " ";
        }
        str += z_str;
        str += " |\n";
        
        str += "| ";
        for (i = w_str.length(); i < col_max; i++) {
          str += " ";
        }
        str += w_str;
        str += " |\n";

        str += "+-";
        for (i = 1; i<=col_max; i++) {
            str += " ";
        }
        str += "-+";
        
        return str;
    }
    
    public String[] toString2() {
        ///////////////////////////////////////////////////////////////
        // Pretty prints current Point3D to an array
        // of strings, a string for each row of the matrix
        ///////////////////////////////////////////////////////////////
        String str[] = new String[6];
        int i;
        String x_str = (new Float(x)).toString();
        String y_str = (new Float(y)).toString();
        String z_str = (new Float(z)).toString();
        String w_str = (new Float(w)).toString();

        int col_max = x_str.length();
        int num = y_str.length();
        if ( num > col_max )
            col_max = num;
        num = z_str.length();
        if ( num > col_max )
            col_max = num;
        
        str[0] = "+-";
        for (i = 1; i<=col_max; i++) {
            str[0] += " ";
        }
        str[0] += "-+";
        str[5] = str[0];
        
        str[1] = "| ";
        for (i = x_str.length(); i < col_max; i++) {
          str[1] += " ";
        }
        str[1] += x_str;
        str[1] += " |";
        
        str[2] = "| ";
        for (i = y_str.length(); i < col_max; i++) {
          str[2] += " ";
        }
        str[2] += y_str;
        str[2] += " |";

        str[3] = "| ";
        for (i = z_str.length(); i < col_max; i++) {
          str[3] += " ";
        }
        str[3] += z_str;
        str[3] += " |";
        
        str[4] = "| ";
        for (i = w_str.length(); i < col_max; i++) {
          str[4] += " ";
        }
        str[4] += w_str;
        str[4] += " |";
        
        return str;
    }

}

