Distance between a point and a line segment.

Parametric equation of line

  dx = x1 - x0
  dy = y1 - y0

  x(t) = x0 + dx * t
  y(t) = y0 + dy * t

Distance from (px, py) to point (x(t), y(t)).


             +--------------------------------------------
             |                    2                       2
 distance = \| (px - (x0 + dx * t))  + (py - (y0 + dy * t))

            
         2                       2                       2
 distance =  (px - (x0 + dx * t))  + (py - (y0 + dy * t))


Derive in t, make equal zero to find the minimum

  
 0 = 2 * dx * (x0 - px + dx * t) + 2 * dy *(y0 - py + dy * t)

Solve for t

       dx * px + dy * py - dx * x0 - dy*y0
  t = ------------------------------------
               2      2
             dx  + dy


     dx *(px - x0) + dy * (py - y0)
 t = -----------------------------
               2      2
             dx  + dy

This t will generate the minimum distance


If t >= 0 and t <= 1 then
 calculate distance from (px, py) to (x(t), y(t))

if (t < 0)

 calculate distance from (px, py) to (x0, y0)

if (t > 1)

 calculate distance from (px, py) to (x1, y1)


#include <cmath>

double Distance(double px, double py, 
		double x0, double y0,
		double x1, double y1)
{
  const double dx = x1 - x0;
  const double dy = y1 - y0;
  const double t = (dx * (px - x0) + dy * (py - y0)) / (dx * dx + dy * dy);
  
  if (t <= 0.0)
  {
    return _hypot(px - x0, py - y0);
  }
  else if (t >= 1.0)
  {
    return _hypot(px - x1, py - y1);
  }
  
  return _hypot(px - (x0 + dx * t), py - (y0 + dy * t));  
}

History