Hi all.
I found myself several times wishing that Line2D could do this specific thing, so I made it do that thing. I called the new class Line2DPlus. The new thing it does is this: it has a method called getClosestPt which returns the point on the line that is closest to any given point.
Here’s the code for the getClosestPt method:
public Point2D.Float getClosestPt ( Point2D.Float targetPoint ) {
// Find the distance from the line to the point:
double ptLineDist = ptLineDist ( targetPoint ) ;
// Find the distance from the line's beginning to the point:
double endPtDist = getP1 ().distance ( targetPoint ) ;
// Calculating the length of the line segment that runs from the line's
// beginning to the point on the line that is closest to the targetPoint:
double segmentLength =
Math.sqrt ( ( endPtDist * endPtDist ) - ( ptLineDist * ptLineDist ) ) ;
// Finding the change in x and y between the endpoints of the line:
double changeX = getP1 ().getX () - getP2 ().getX () ;
double changeY = getP1 ().getY () - getP2 ().getY () ;
// Finding the length of the line:
double length = getP1 ().distance ( getP2 () ) ;
// Determining the change in X and Y for the new segment:
double newX = segmentLength * changeX / length ;
double newY = segmentLength * changeY / length ;
// Finding the end point of the new segment:
Point2D.Float newEnd =
new Point2D.Float ( ( float ) ( getP1 ().getX () + newX ) ,
( float ) ( getP1 ().getY () + newY ) ) ;
// Returning that point:
return newEnd ;
}
Any comments? Specifically, I’m curious if anybody can see a better way to do the same thing.