From 2337d143ce17cbe6bf6d6fc549020dd7cccb9359 Mon Sep 17 00:00:00 2001 From: Phillip Date: Fri, 4 Feb 2011 02:38:41 +0000 Subject: Completed Code transfer, javadoc soon. --- src/tesseract/objects/Icosahedron.java | 156 ++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 3 deletions(-) (limited to 'src/tesseract/objects/Icosahedron.java') 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(); + } } -- cgit v1.2.3