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
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);
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);
}
}