Skip to content
Advertisement

Calculate the euclidian distance between an array of points to a line segment in Python without for loop

I’m looking for a function to compute the euclidian distance between a numpy array of points with two coordinates (x, y) and a line segment. My goal is to have a result in under 0.01 sec for a line segment and 10k points.

I already found a function for a single point. But running a for loop is very inefficient.

I also found this function that calculates the distance to the infinite line:

JavaScript

It is very efficient and I would like to have a similar approach for a bounded line.

Thank you for your help.

Advertisement

Answer

Setup – test point P, endpoints A and B:

enter image description here

  • Take the dot-product of P - A with normalize(A - B) to obtain the signed parallel distance component s from A. Likewise with B and t.

  • Take the maximum of these two numbers and zero to get the clamped parallel distance component. This will only be non-zero if the point is outside the “boundary” (Voronoi region?) of the segment.

  • Calculate the perpendicular distance component as before, using the cross-product.

  • Use Pythagoras to compute the required closest distance (gray line from P to A).

The above is branchless and thus easy to vectorize with numpy:

JavaScript
Advertisement