HOME

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)


----


```cpp
#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