summaryrefslogtreecommitdiff
path: root/src/tesseract/objects/Icosahedron.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/tesseract/objects/Icosahedron.java')
-rw-r--r--src/tesseract/objects/Icosahedron.java156
1 files changed, 153 insertions, 3 deletions
diff --git a/src/tesseract/objects/Icosahedron.java b/src/tesseract/objects/Icosahedron.java
index 614fbf2..7786f85 100644
--- a/src/tesseract/objects/Icosahedron.java
+++ b/src/tesseract/objects/Icosahedron.java
@@ -5,10 +5,20 @@
*/
package tesseract.objects;
+import javax.media.j3d.Appearance;
+import javax.media.j3d.ColoringAttributes;
+import javax.media.j3d.GeometryArray;
+import javax.media.j3d.Group;
+import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.TransformGroup;
+import javax.media.j3d.TriangleArray;
+import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;
+import com.sun.j3d.utils.geometry.GeometryInfo;
+import com.sun.j3d.utils.geometry.NormalGenerator;
+
/**
* Represents an Icosahedron, a 20 sided object who's
* faces are all equal equilateral triangles.
@@ -17,18 +27,24 @@ import javax.vecmath.Vector3f;
*/
public class Icosahedron extends ForceableObject {
//CONSTANTS
- //private static final Color DEFAULTCOLOR;
+ private static final int MAX_ANGLE = 120;
+ private static final float DEFAULT_SCALE = 1;
+ private static final int NUM_VERTEX = 12;
+ private static final float GOLDEN_RATIO = (float) ((1.0 + Math.sqrt(5.0)) / 2.0);
//FIELDS
private Shape3D myShape;
+ private float myScale;
+
private TransformGroup myTG;
//CONSTRUCTORS
/**
* Create new Icosahedron.
*/
- public Icosahedron(final Vector3f position, final float mass, final Vector3f scale) {
+ public Icosahedron(final Vector3f position, final float mass, float scale) {
this(position, mass);
+ myScale = scale;
}
/**
* Create new Icosahedron.
@@ -37,7 +53,141 @@ public class Icosahedron extends ForceableObject {
*/
public Icosahedron(final Vector3f position, final float mass) {
super(position, mass);
- // TODO Auto-generated constructor stub
+ myScale = DEFAULT_SCALE;
+ myTG = new TransformGroup();
}
+ public void buildIcosahedron() {
+ // TODO Auto-generated method stub
+ Point3f coordinates[] = new Point3f[NUM_VERTEX];
+
+ float phi = GOLDEN_RATIO;
+ int i = 0;
+ // Y / Z Plane coordinates
+ coordinates[i++] = new Point3f(0f, 1.0f, phi); //0
+ coordinates[i++] = new Point3f(0f, 1.0f, -1 * phi);
+ coordinates[i++] = new Point3f(0f, -1.0f, -1 * phi);
+ coordinates[i++] = new Point3f(0f, -1.0f, phi);
+ // X / Y Plane coordinates
+ coordinates[i++] = new Point3f(1f, phi, 0); //4
+ coordinates[i++] = new Point3f(-1f, phi, 0);
+ coordinates[i++] = new Point3f(1f, -1 * phi, 0);
+ coordinates[i++] = new Point3f(-1f, -1 *phi, 0);
+ // X / Z Plane coordinates
+ coordinates[i++] = new Point3f(phi, 0, 1f); //8
+ coordinates[i++] = new Point3f(phi, 0, -1f);
+ coordinates[i++] = new Point3f(-1 * phi, 0, 1f);
+ coordinates[i++] = new Point3f(-1 * phi, 0, -1f);
+
+ // TODO: Scaling
+
+ for (int it = 0; it < coordinates.length; it++) {
+ coordinates[it].scale((float) 2);
+ }
+
+ GeometryArray die = new TriangleArray(((NUM_VERTEX / 2) - 1) *
+ coordinates.length, GeometryArray.COORDINATES);
+ int index = 0;
+
+
+ //Builds triangles
+ die.setCoordinate(index++, coordinates[0]);
+ die.setCoordinate(index++, coordinates[8]);
+ die.setCoordinate(index++, coordinates[4]);
+
+ die.setCoordinate(index++, coordinates[0]);
+ die.setCoordinate(index++, coordinates[4]);
+ die.setCoordinate(index++, coordinates[5]);
+
+ die.setCoordinate(index++, coordinates[0]);
+ die.setCoordinate(index++, coordinates[5]);
+ die.setCoordinate(index++, coordinates[10]);
+
+ die.setCoordinate(index++, coordinates[0]);
+ die.setCoordinate(index++, coordinates[10]);
+ die.setCoordinate(index++, coordinates[3]);
+
+ die.setCoordinate(index++, coordinates[0]);
+ die.setCoordinate(index++, coordinates[3]);
+ die.setCoordinate(index++, coordinates[8]);
+
+ die.setCoordinate(index++, coordinates[8]);
+ die.setCoordinate(index++, coordinates[9]);
+ die.setCoordinate(index++, coordinates[4]);
+
+ die.setCoordinate(index++, coordinates[4]);
+ die.setCoordinate(index++, coordinates[9]);
+ die.setCoordinate(index++, coordinates[1]);
+
+ die.setCoordinate(index++, coordinates[4]);
+ die.setCoordinate(index++, coordinates[1]);
+ die.setCoordinate(index++, coordinates[5]);
+
+ die.setCoordinate(index++, coordinates[5]);
+ die.setCoordinate(index++, coordinates[1]);
+ die.setCoordinate(index++, coordinates[11]);
+
+ die.setCoordinate(index++, coordinates[5]);
+ die.setCoordinate(index++, coordinates[11]);
+ die.setCoordinate(index++, coordinates[10]);
+
+ die.setCoordinate(index++, coordinates[10]);
+ die.setCoordinate(index++, coordinates[11]);
+ die.setCoordinate(index++, coordinates[7]);
+
+ die.setCoordinate(index++, coordinates[10]);
+ die.setCoordinate(index++, coordinates[7]);
+ die.setCoordinate(index++, coordinates[3]);
+
+ die.setCoordinate(index++, coordinates[3]);
+ die.setCoordinate(index++, coordinates[7]);
+ die.setCoordinate(index++, coordinates[6]);
+
+ die.setCoordinate(index++, coordinates[3]);
+ die.setCoordinate(index++, coordinates[6]);
+ die.setCoordinate(index++, coordinates[8]);
+
+ die.setCoordinate(index++, coordinates[8]);
+ die.setCoordinate(index++, coordinates[6]);
+ die.setCoordinate(index++, coordinates[9]);
+
+ die.setCoordinate(index++, coordinates[9]);
+ die.setCoordinate(index++, coordinates[2]);
+ die.setCoordinate(index++, coordinates[1]);
+
+ die.setCoordinate(index++, coordinates[1]);
+ die.setCoordinate(index++, coordinates[2]);
+ die.setCoordinate(index++, coordinates[11]);
+
+ die.setCoordinate(index++, coordinates[11]);
+ die.setCoordinate(index++, coordinates[2]);
+ die.setCoordinate(index++, coordinates[7]);
+
+ die.setCoordinate(index++, coordinates[7]);
+ die.setCoordinate(index++, coordinates[2]);
+ die.setCoordinate(index++, coordinates[6]);
+
+ die.setCoordinate(index++, coordinates[6]);
+ die.setCoordinate(index++, coordinates[2]);
+ die.setCoordinate(index++, coordinates[9]);
+
+ TransformGroup trans = new TransformGroup();
+ NormalGenerator norms = new NormalGenerator(MAX_ANGLE);
+ GeometryInfo geo = new GeometryInfo(die);
+ norms.generateNormals(geo);
+
+ Shape3D mesh = new Shape3D(geo.getGeometryArray());
+ Appearance meshApp = new Appearance();
+ Material surface = new Material();
+ surface.setDiffuseColor(.9f, .05f, .05f);
+ meshApp.setMaterial(surface);
+ meshApp.setColoringAttributes(new ColoringAttributes(.9f,
+ .05f, .05f, ColoringAttributes.NICEST));
+ mesh.setAppearance(meshApp);
+ myTG.addChild(mesh);
+ }
+
+ public Group getGroup(){
+ return (Group) myTG.cloneTree();
+ }
}