

import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;

public class Dodeca
{

  public Dodeca()
  {
    // Nothing to do.
  } // end constructor 


  public Geometry Line()
  {
  
    // Define a VE by edges
    int NV = 2 * 24;

    Point3f[] coord  = new Point3f[NV];
 
    LineArray la = new LineArray(NV, LineArray.COORDINATES); 

    Point3f v1   = new Point3f( 0.0f,  0.0f,  2.0f);
    Point3f v2   = new Point3f(-1.0f, -1.0f,  1.0f); 
    Point3f v3   = new Point3f( 1.0f, -1.0f,  1.0f); 
    Point3f v4   = new Point3f( 1.0f,  1.0f,  1.0f); 
    Point3f v5   = new Point3f(-1.0f,  1.0f,  1.0f); 
    Point3f v6   = new Point3f( 2.0f,  0.0f,  0.0f); 
    Point3f v7   = new Point3f( 0.0f,  2.0f,  0.0f); 
    Point3f v8   = new Point3f(-2.0f,  0.0f,  0.0f); 
    Point3f v9   = new Point3f( 0.0f, -2.0f,  0.0f); 
    Point3f v10  = new Point3f(-1.0f, -1.0f, -1.0f); 
    Point3f v11  = new Point3f( 1.0f, -1.0f, -1.0f); 
    Point3f v12  = new Point3f( 1.0f,  1.0f, -1.0f); 
    Point3f v13  = new Point3f(-1.0f,  1.0f, -1.0f); 
    Point3f v14  = new Point3f( 0.0f,  0.0f, -2.0f); 

    coord[0] = v1; 
    coord[1] = v2; 

    coord[2] = v1; 
    coord[3] = v3; 

    coord[4] = v1; 
    coord[5] = v4; 

    coord[6] = v1; 
    coord[7] = v5; 

    coord[8] = v2; 
    coord[9] = v8; 

    coord[10] = v2; 
    coord[11] = v9; 
 
    coord[12] = v3; 
    coord[13] = v9; 

    coord[14] = v3; 
    coord[15] = v6; 

    coord[16] = v4; 
    coord[17] = v6; 

    coord[18] = v4; 
    coord[19] = v7; 

    coord[20] = v5; 
    coord[21] = v7; 

    coord[22] = v5; 
    coord[23] = v8; 

    coord[24] = v10; 
    coord[25] = v8; 

    coord[26] = v10; 
    coord[27] = v9; 

    coord[28] = v11; 
    coord[29] = v9; 

    coord[30] = v11; 
    coord[31] = v6; 

    coord[32] = v12; 
    coord[33] = v6; 

    coord[34] = v12; 
    coord[35] = v7; 
 
    coord[36] = v13; 
    coord[37] = v7; 

    coord[38] = v13; 
    coord[39] = v8; 

    coord[40] = v14; 
    coord[41] = v10; 

    coord[42] = v14; 
    coord[43] = v11; 

    coord[44] = v14; 
    coord[45] = v12; 

    coord[46] = v14; 
    coord[47] = v13; 

    la.setCoordinates(0, coord);

    return(la);

  } // end Line()


  public Geometry Solid()
  {

    int NV = 4 * 12;

    Point3f[] coord  = new Point3f[NV];
    Vector3f[] norms = new Vector3f[NV];
 
    QuadArray ta = new QuadArray(NV, QuadArray.COORDINATES | QuadArray.NORMALS); 

    Point3f v1   = new Point3f( 0.0f,  0.0f,  2.0f);
    Point3f v2   = new Point3f(-1.0f, -1.0f,  1.0f); 
    Point3f v3   = new Point3f( 1.0f, -1.0f,  1.0f); 
    Point3f v4   = new Point3f( 1.0f,  1.0f,  1.0f); 
    Point3f v5   = new Point3f(-1.0f,  1.0f,  1.0f); 
    Point3f v6   = new Point3f( 2.0f,  0.0f,  0.0f); 
    Point3f v7   = new Point3f( 0.0f,  2.0f,  0.0f); 
    Point3f v8   = new Point3f(-2.0f,  0.0f,  0.0f); 
    Point3f v9   = new Point3f( 0.0f, -2.0f,  0.0f); 
    Point3f v10  = new Point3f(-1.0f, -1.0f, -1.0f); 
    Point3f v11  = new Point3f( 1.0f, -1.0f, -1.0f); 
    Point3f v12  = new Point3f( 1.0f,  1.0f, -1.0f); 
    Point3f v13  = new Point3f(-1.0f,  1.0f, -1.0f); 
    Point3f v14  = new Point3f( 0.0f,  0.0f, -2.0f); 

    coord[0]  = v1; 
    coord[1]  = v2; 
    coord[2]  = v9;  
    coord[3]  = v3; 

    coord[4]  = v1; 
    coord[5]  = v3; 
    coord[6]  = v6; 
    coord[7]  = v4; 

    coord[8]  = v1;
    coord[9]  = v4;  
    coord[10] = v7; 
    coord[11] = v5; 

    coord[12] = v1; 
    coord[13] = v5; 
    coord[14] = v8; 
    coord[15] = v2; 

    coord[16] = v2; 
    coord[17] = v8; 
    coord[18] = v10; 
    coord[19] = v9; 

    coord[20] = v3; 
    coord[21] = v9; 
    coord[22] = v11; 
    coord[23] = v6; 

    coord[24]  = v4; 
    coord[25]  = v6; 
    coord[26]  = v12;  
    coord[27]  = v7; 

    coord[28]  = v5; 
    coord[29]  = v7; 
    coord[30]  = v13; 
    coord[31]  = v8; 

    coord[32]  = v9;
    coord[33]  = v10;  
    coord[34]  = v14; 
    coord[35]  = v11; 

    coord[36] = v6; 
    coord[37] = v11; 
    coord[38] = v14; 
    coord[39] = v12; 

    coord[40] = v7; 
    coord[41] = v12; 
    coord[42] = v14; 
    coord[43] = v13; 

    coord[44] = v8; 
    coord[45] = v13; 
    coord[46] = v14; 
    coord[47] = v10; 

    ta.setCoordinates(0, coord);

    // need to calculate all normals

    for (int i = 0; i < 12; i++)
    {
      // For each quad face, calculate a normal

      int j = 4 * i;

      Vector3f hold1 = new Vector3f(coord[j].x - coord[j+1].x, 
                                    coord[j].y - coord[j+1].y, 
                                    coord[j].z - coord[j+1].z);


      Vector3f hold2 = new Vector3f(coord[j+1].x - coord[j+2].x, 
                                    coord[j+1].y - coord[j+2].y, 
                                    coord[j+1].z - coord[j+2].z);

      Vector3f hold3 = new Vector3f(coord[j+2].x - coord[j].x, 
                                    coord[j+2].y - coord[j].y, 
                                    coord[j+2].z - coord[j].z);

      Vector3f hold4 = new Vector3f(0.0f, 0.0f, 0.0f);

      hold4.cross(hold1, hold2); 
      norms[j] = new Vector3f(hold4);
      norms[j+1] = norms[j];  
      norms[j+2] = norms[j];  
      norms[j+3] = norms[j];  

      norms[j].normalize();
      norms[j+1].normalize();
      norms[j+2].normalize();
      norms[j+3].normalize();

    } // end for statement 

    ta.setNormals(0, norms);

    return(ta);

  } // end Solid()

} // end Dodeca


