import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
// drawing of the coordinate system
public class Triad extends javax.media.j3d.TransformGroup {

   public Triad (Appearance app) {
      Point3f [] coords = new Point3f[6];
      coords[0] = new Point3f(0.f,0.f,0.f);
      coords[1] = new Point3f(1.f,0.f,0.f);
      coords[2] = new Point3f(0.f,0.f,0.f);
      coords[3] = new Point3f(0.f,1.f,0.f);
      coords[4] = new Point3f(0.f,0.f,0.f);
      coords[5] = new Point3f(0.f,0.f,1.f);

      LineArray lines = new LineArray(
      6,
      GeometryArray.COORDINATES  | GeometryArray.NORMALS);
      lines.setCoordinates( 0, coords );
      Shape3D reper = new Shape3D(lines);
      this.addChild(reper);

      Appearance appConeX = new Appearance();
      Appearance appConeY = new Appearance();
      Appearance appConeZ = new Appearance();

      Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
      Color3f white = new Color3f(1.1f, 1.0f, 1.0f);
      Color3f objColorConeX = new Color3f(0.0f, 0.9f, 0.2f);
      Color3f objColorConeY = new Color3f(0.0f, 0.0f, 0.8f);
      Color3f objColorConeZ = new Color3f(0.8f, 0.2f, 0.2f);

      appConeX.setMaterial(new Material(objColorConeX, objColorConeX, objColorConeX, white, 80.0f));
      appConeY.setMaterial(new Material(objColorConeY, objColorConeY, objColorConeY, white, 80.0f));
      appConeZ.setMaterial(new Material(objColorConeZ, objColorConeZ, objColorConeZ, white, 80.0f));
      Primitive coneXShape3D = (Primitive) new Cone(0.05f,0.15f,Cone.GENERATE_NORMALS,appConeX);
      Primitive coneYShape3D = (Primitive) new Cone(0.05f,0.15f,Cone.GENERATE_NORMALS,appConeY);
      Primitive coneZShape3D = (Primitive) new Cone(0.05f,0.15f,Cone.GENERATE_NORMALS,appConeZ);
      TransformGroup conesTG[] = new TransformGroup[3];
      Transform3D transCones[] = new Transform3D[3];
      for(int i = 0; i < 3; i++) {
        conesTG[i] = new TransformGroup();
        transCones[i] = new Transform3D();
      }

      conesTG[0].addChild(coneXShape3D);
      conesTG[1].addChild(coneYShape3D);
      conesTG[2].addChild(coneZShape3D);

      transCones[0].rotZ(- Math.PI / 2.0);
      transCones[2].rotX(Math.PI / 2.0);

      transCones[0].setTranslation(new Vector3d(0.95,0.,0.));
      transCones[1].set(new Vector3d(0.,0.95,0.));
      transCones[2].setTranslation(new Vector3d(0.,0.,0.95));
      TransformGroup reperTG = new TransformGroup();
      for(int i = 0; i < 3; i++) {
        conesTG[i].setTransform(transCones[i]);
        reperTG.addChild(conesTG[i]);
      }

      this.addChild(reperTG);
   }
}