|
in which case, you'd might want to use exception handling and detect those two, on the first one, set perpendicular_slope to be 0, and in the other, set it to be POSITIVE_INFINITY. -- Avihoo Ilan |
|
in which case, you'd might want to use exception handling and catch those two division by zero exceptions, on the first one, set perpendicular_slope to be 0, and in the other, set it to be POSITIVE_INFINITY. -- Avihoo Ilan |
Not that I know of, the one you found (well, there's also a not-squared one I think) is the closest I know about. However, it is probably fairly trivial to find it with that distance - you could just move perpendicular from the line that distance. Might not be that great for codesize, though. I've found it myself without that method, too. -- Kawigi
Here you go:
public double pointToLineDistance?(Point2D point, Line2D line) { return Math.abs((line.getX2() - line.getX1()) * (line.getY1() - point.getY()) - (line.getX1() - point.getX()) * (line.getY2() - line.getY1())) / lineLength(line); }
public double lineLength(Line2D line) {
return Math.sqrt(Math.pow(line.getX2() - line.getX1(), 2) + Math.pow(line.getY2() - line.getY1(), 2));
}
public Point2D closestPointOnLine?(Point2D point, Line2D line) { double distance = pointToLineDistance?(point, line); double length = lineLength(line); return new Point2D.Double(point.getX() - distance * (line.getX2() - line.getX1()) / length, point.getY() + distance * (line.getY2() - line.getY1()) / length); }
That code is completely untested and unguaranteed, but it is correct to the best of my knowledge. Please test it before using it, all I know is that it compiles. :)
If you are at all interested in the math, you may want to check [this] out. --nano
The shortest distance between a line and an arbitrary point is a new line perpendicular to our first. Lets define: Line2D(x1,y1,x2,y2) as a line given by two colinear points (points on that line) Point2D(x,y) as our arbitray point
public Point2D closestPointOnLine(Point2D point, Line2D line)
{
slope = ( (line.getY2() - line.getY()) / (line.getX2() - line.getX()) );
// A line perpendicular to our original line has a slope that
// is the negative reciprocal of the other's slope
perpendicular_slope = -(1/slope);
// This calculates the x-intersect, the equation was derived by
// setting the two slope-point equations equal to themselves
// and solving for x
x_intersect = ( point.getY() - line.getY() + ( slope * line.getY() ) - ( perpendicular_slope * point.getY() ) )
/ ( slope - perpendicular_slope );
// Get the y-intersect based upon a sigle point-slope equation
y_intersect = ( slope * ( x_intersect - line.getX() ) ) + line.getY();
// Return our point
return new Point2D.Double(x_intersect, y_intersect);
}
This code hasn't been tested, but the formulas are correct to the best of my ability and I double checked them. I hope this helps. (Added 16:35 GMT-6 April 13, 2005) -- troutinator
slope = ( (line.getY2() - line.getY()) / (line.getX2() - line.getX()) ); or perpendicular_slope = -(1/slope); can return a runtime error because if line.getX2() - line.getX() equals to 0 or if the slope is calculated to be 0 (line.getY2() - line.getY() equals to zero). in which case, you'd might want to use exception handling and catch those two division by zero exceptions, on the first one, set perpendicular_slope to be 0, and in the other, set it to be POSITIVE_INFINITY. -- Avihoo Ilan