checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Line.java
index 7fb9b86..5997130 100644 (file)
@@ -2,7 +2,7 @@ package edu.berkeley.qfat.geom;
 import javax.media.opengl.*;
 
 /** an infinitely long line in 3-space */
-public class Line {
+public class Line implements AffineConstraint {
 
     // y=mx+c
     // z=nx+d
@@ -33,10 +33,16 @@ public class Line {
         return "[line: y="+m+"x+"+c+" z="+n+"x+"+d+"]";
     }
 
-    public double distance(Point p) { return projection(p).distance(p); }
+    public double distance(Point p) { return getProjection(p).distance(p); }
+
+    public Vec getUnit() {
+        Point p1 = new Point(0, c,   d);
+        Point p2 = new Point(1, m+c, n+d);
+        return p2.minus(p1).norm();
+    }
 
     /** returns the point on this line which is closest to p */
-    public Point projection(Point p) {
+    public Point getProjection(Point p) {
         /*
         Point p1 = new Point(0, c,   d);
         Point p2 = new Point(1, m+c, n+d);
@@ -46,10 +52,18 @@ public class Line {
         throw new RuntimeException("test this before using; may not be correct");
     }
 
-    public Vec getUnit() {
-        Point p1 = new Point(0, c,   d);
-        Point p2 = new Point(1, m+c, n+d);
-        return p2.minus(p1).norm();
+    public AffineConstraint intersect(AffineConstraint con, float epsilon) {
+        if (!(con instanceof Line)) return con.intersect(this, epsilon);
+        Line line = (Line)con;
+        if (Math.abs(this.m-line.m) <= epsilon &&
+            Math.abs(this.n-line.n) <= epsilon &&
+            Math.abs(this.c-line.c) <= epsilon &&
+            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;
+        return new Point(x, m*x+c, n*x+d);
     }
 
 }