package ProGAL.geom3d.volumes; import ProGAL.geom3d.Circle; import ProGAL.geom3d.Point; import ProGAL.geom3d.Vector; import ProGAL.geom3d.viewer.J3DScene; /** * An infinite cone is the union of all half-lines starting at an apex-point whose angle to a specified * axis-vector is less than a specified constant. This class represents an infinitely extended cone * defined by these three elements. * @author R.Fonseca */ public class InfCone { protected Point apex; protected Vector axis; protected double angle; /** * Construct the cone by specifying the apex-point, direction-vector and angle. * @param apex * @param axis * @param angle */ public InfCone(Point apex, Vector axis, double angle){ this.apex = apex; this.axis = axis; this.angle = angle; } /** * Construct the cone with the specified apex such that the points p1, p2 and * p3 are all on the boundary of the cone. * @param apex * @param p1 * @param p2 * @param p3 */ public InfCone(Point apex, Point p1, Point p2, Point p3){ Vector v1 = apex.vectorTo(p1); v1.normalizeThis(); Vector v2 = apex.vectorTo(p2); v2.normalizeThis(); Vector v3 = apex.vectorTo(p3); v3.normalizeThis(); Circle c = new Circle( apex.add(v1), apex.add(v2), apex.add(v3) ); axis = apex.vectorTo(c.getCenter()).normalizeThis(); angle = 2*Math.atan(c.getRadius()/apex.distance(c.getCenter())); } public Point getApex(){ return apex; } public Vector getAxis(){ return axis; } public double getAngle(){ return angle; } public String toString(int dec){ return String.format("Cone[apex:%s,axis:%s,angle:%."+dec+"f]", apex,axis,angle); } public String toString(){ return toString(2); } public static void main(String[] args){ J3DScene scene = J3DScene.createJ3DSceneInFrame(); Point p0 = new Point(Point.getRandomPoint(3, -1.0, 1.0).getCoords()); Point p1 = new Point(Point.getRandomPoint(3, -1.0, 1.0).getCoords()); Point p2 = new Point(Point.getRandomPoint(3, -1.0, 1.0).getCoords()); Point p3 = new Point(Point.getRandomPoint(3, -1.0, 1.0).getCoords()); InfCone n = new InfCone(p0, p1, p2, p3); System.out.println(p0); System.out.println(n); Cone c = new Cone( n.getApex().add(n.getAxis()),n.getApex(), Math.tan(n.getAngle()/2) ); // System.out.println(c); // Cone c = new Cone(new Point(0,0,1),new Point(1,1,0), 0.1); scene.addShape(new Sphere(p0,0.05), java.awt.Color.BLACK); scene.addShape(new Sphere(p1,0.05)); scene.addShape(new Sphere(p2,0.05)); scene.addShape(new Sphere(p3,0.05)); scene.addShape(c, new java.awt.Color(0,0,200,240), 100); scene.setAxisEnabled(true); } }