Java tutorial
import java.awt.Point; public class Util { /** * Returns distance to segment * * @param ss * segment start point * @param se * segment end point * @param p * point to found closest point on segment * @return distance to segment */ public static double getDistanceToSegment(Point ss, Point se, Point p) { return getDistanceToSegment(ss.x, ss.y, se.x, se.y, p.x, p.y); } /** * Returns distance to segment * * @param sx1 * segment x coord 1 * @param sy1 * segment y coord 1 * @param sx2 * segment x coord 2 * @param sy2 * segment y coord 2 * @param px * point x coord * @param py * point y coord * @return distance to segment */ public static double getDistanceToSegment(int sx1, int sy1, int sx2, int sy2, int px, int py) { Point closestPoint = getClosestPointOnSegment(sx1, sy1, sx2, sy2, px, py); return getDistance(closestPoint.x, closestPoint.y, px, py); } /** * Returns distance between two 2D points * * @param point1 * first point * @param point2 * second point * @return distance between points */ public static double getDistance(Point point1, Point point2) { return getDistance(point1.x, point1.y, point2.x, point2.y); } /** * Returns distance between two sets of coords * * @param x1 * first x coord * @param y1 * first y coord * @param x2 * second x coord * @param y2 * second y coord * @return distance between sets of coords */ public static double getDistance(float x1, float y1, float x2, float y2) { // using long to avoid possible overflows when multiplying double dx = x2 - x1; double dy = y2 - y1; // return Math.hypot(x2 - x1, y2 - y1); // Extremely slow // return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); // 20 times faster than hypot return Math.sqrt(dx * dx + dy * dy); // 10 times faster then previous line } /** * Returns closest point on segment to point * * @param ss * segment start point * @param se * segment end point * @param p * point to found closest point on segment * @return closest point on segment to p */ public static Point getClosestPointOnSegment(Point ss, Point se, Point p) { return getClosestPointOnSegment(ss.x, ss.y, se.x, se.y, p.x, p.y); } /** * Returns closest point on segment to point * * @param sx1 * segment x coord 1 * @param sy1 * segment y coord 1 * @param sx2 * segment x coord 2 * @param sy2 * segment y coord 2 * @param px * point x coord * @param py * point y coord * @return closets point on segment to point */ public static Point getClosestPointOnSegment(int sx1, int sy1, int sx2, int sy2, int px, int py) { double xDelta = sx2 - sx1; double yDelta = sy2 - sy1; if ((xDelta == 0) && (yDelta == 0)) { throw new IllegalArgumentException("Segment start equals segment end"); } double u = ((px - sx1) * xDelta + (py - sy1) * yDelta) / (xDelta * xDelta + yDelta * yDelta); final Point closestPoint; if (u < 0) { closestPoint = new Point(sx1, sy1); } else if (u > 1) { closestPoint = new Point(sx2, sy2); } else { closestPoint = new Point((int) Math.round(sx1 + u * xDelta), (int) Math.round(sy1 + u * yDelta)); } return closestPoint; } }