X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FLine.java;h=14a1f6d248f0e4fa9431b1826f6a557b6ab4e7c1;hp=a4dd2a09b5eb2e5bad23f30603ac68b7c77eb8d9;hb=HEAD;hpb=64c6939d78acfa06e7bc380cb713e3800bf16be5 diff --git a/src/edu/berkeley/qfat/geom/Line.java b/src/edu/berkeley/qfat/geom/Line.java index a4dd2a0..14a1f6d 100644 --- a/src/edu/berkeley/qfat/geom/Line.java +++ b/src/edu/berkeley/qfat/geom/Line.java @@ -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,13 +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) { - throw new RuntimeException("not yet implemented"); + // 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)); } }