Returns distance to segment : Geometry « 2D Graphics GUI « Java






Returns distance to segment

      
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;
  }
}

   
    
    
    
    
    
  








Related examples in the same category

1.Collection of geometry utility methods
2.Unions Rectangle2D
3.Interpolates points given in the 2D plane
4.Returns distance between two sets of coords
5.Returns distance between 3D set of coords
6.Returns closest point on segment to point
7.Calculate Angle From
8.Hexagon demo
9.Implements an Vector in 3D space.
10.Implementation of the 4 dimensional vector.
11.Quaternion
12.Circle shape
13.Geometry Utilities
14.This is a Polygon that allows the user to flip and swap the points along it's axis.
15.Fast trigonometric operationsFast trigonometric operations
16.A class to represent a latitude and longitude
17.An undirected graph that keeps track of connected components (groups).
18.Generates n logarithmically-spaced points between d1 and d2 using the provided base.
19.Returns a dimension where width and height are inside the bounds of the maxWidth and maxHeight parameters