checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Line.java
index 5997130..14a1f6d 100644 (file)
@@ -10,12 +10,18 @@ public class Line implements AffineConstraint {
 
     /** the line passing through two points */
     public Line(Point p1, Point p2) {
+        // FIXME: division by zero?
         this.m = (p2.y-p1.y)/(p2.x-p1.x);
         this.n = (p2.z-p1.z)/(p2.x-p1.x);
         this.c = p1.y - m * p1.x;
         this.d = p1.z - n * p1.x;
     }
 
+    /** the line passing through p1 with direction v */
+    public Line(Point p1, Vec v) {
+        this(p1, v.plus(p1));
+    }
+
     public int hashCode() {
         return
             Float.floatToIntBits(m) ^
@@ -43,13 +49,13 @@ public class Line implements AffineConstraint {
 
     /** returns the point on this line which is closest to p */
     public Point getProjection(Point p) {
-        /*
         Point p1 = new Point(0, c,   d);
         Point p2 = new Point(1, m+c, n+d);
         Vec w = p.minus(p1);
-        return getUnit().times(w.dot(getUnit()));
-        */
+        return p1.plus(getUnit().times(w.dot(getUnit())));
+        /*
         throw new RuntimeException("test this before using; may not be correct");
+        */
     }
 
     public AffineConstraint intersect(AffineConstraint con, float epsilon) {
@@ -61,9 +67,16 @@ public class Line implements AffineConstraint {
             Math.abs(this.d-line.d) <= epsilon)
             return this;
         float x = (line.c-this.c)/(this.m-line.m);
-        if (Math.abs( (m*x+c)-(line.m*x+line.c) ) > epsilon ) return null;
-        if (Math.abs( (n*x+d)-(line.n*x+line.d) ) > epsilon ) return null;
+        if (Math.abs( (m*x+c)-(line.m*x+line.c) ) > epsilon ) return AffineConstraint.NONE;
+        if (Math.abs( (n*x+d)-(line.n*x+line.d) ) > epsilon ) return AffineConstraint.NONE;
         return new Point(x, m*x+c, n*x+d);
     }
 
+    public AffineConstraint multiply(Matrix m) {
+        // FIXME: ugly
+        Point p1 = new Point(0, c, d);
+        Point p2 = new Point(1, this.m+c, n+d);
+        return new Line(m.times(p1), m.times(p2));
+    }
+
 }