package ProGAL.geom3d; import java.awt.Color; //import ProGAL.geom3d.viewer.J3DScene; import ProGAL.geom3d.volumes.Cylinder; /** * A line segment spanned by two points, a and b. */ public class LineSegment implements Simplex{ protected Point a, b; /** Constructs a segment between points a and b. */ public LineSegment(Point a, Point b) { this.a = a; this.b = b; } /** Constructs a segment from a to a+v. */ public LineSegment(Point a, Vector v) { this.a = a; this.b = a.add(v); } /** Get the first point spanning the segment. */ public Point getA() { return a; } /** Get the second point spanning the segment. */ public Point getB() { return b; } /** Change the first point spanning the segment. */ public void setA(Point a) { this.a = a; } /** Change the second point spanning the segment. */ public void setB(Point b) { this.b = b; } /** Get the direction of the segment. This method returns a new object. */ public Vector getAToB(){ return a.vectorTo(b); } /** Get the length of the segment. */ public double getLength() { return Math.sqrt(getLengthSquared()); } /** Get the squared length of the segment. */ public double getLengthSquared() { return a.distanceSquared(b); } /** Get the point on the segment closest to a given point q. This method always returns * a new object.*/ public Point getClosestPoint(Point q) { Vector dir = a.vectorTo(b);; Vector aq = a.vectorTo(q);; double t = dir.dot(aq)/dir.getLengthSquared(); t = Math.min(1, Math.max(0,t)); return new Point(a.x() + t*dir.x(), a.y() + t*dir.y(), a.z() + t*dir.z()); } /** Gets the squared distance from q to the nearest point on this segment. */ public double getSquaredDistance(Point q) { return q.distanceSquared(getClosestPoint(q)); } /** Gets the distance from q to the nearest point on this segment. */ public double getDistance(Point q) { return q.distance(getClosestPoint(q)); } /** Gets the midpoint of the segment. */ public Point getMidPoint() { return Point.getMidpoint(a, b); } /** * Returns the mid-point of this line-segment. Since a line-segment can be interpreted as * a geometric shape (a 1-simplex) the Shape interface requires the getCenter method to be implemented. * TODO: Test */ public Point getCenter() { return getMidPoint(); } /** TODO: Comment and test */ public Point getPoint(int i) { if(i<0 || i>1) throw new IllegalArgumentException("Invalid index ("+i+") 1-simplex has two points only"); if(i==0) return a; else return b; } /** Return the 'dimension' of this object. Required by the interface Simplex. */ public int getDimension() { return 1; } /** Returns true iff the argument is a line-segment and equals this. */ public boolean equals(Object o){ if(o instanceof LineSegment) return equals((LineSegment)o); return false; } /** Returns true iff this line-segment and ls are the same. Two line-segments are not * considered equal if they have the same end-points but in different orders. */ public boolean equals(LineSegment ls){ return a.equals(ls.a)&& b.equals(ls.b); } /** Returns a deep clone of this line segment. */ public LineSegment clone(){ return new LineSegment(a.clone(),b.clone()); } /** Returns a string representation of this segments. */ public String toString(){ return "Segment["+a+","+b+"]"; } /** Returns a string representation of this segments with dec decimals precision. */ public String toString(int dec){ return "Segment["+a.toString(dec)+","+b.toString(dec)+"]"; } /** Writes this segment to System.out. */ public void toConsole(){ System.out.println(toString()); } /** Writes this segment to System.out with dec decimals precision. */ public void toConsole(int dec){ System.out.println(toString(dec)); } // public Cylinder toScene(J3DScene scene, double r, Color clr) { // Cylinder cyl = new Cylinder(this, r); // scene.addShape(cyl, clr); // return cyl; // } // public Cylinder toScene(J3DScene scene, double r, Color clr, int detail) { // Cylinder cyl = new Cylinder(this, r); // scene.addShape(cyl, clr, detail); // return cyl; // } }