/** 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) ^
/** 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) {
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));
}
}