def line2d_seg_dist(p1, p2, p0):
 x21 = (p2[0] - p1[0])
 y21 = (p2[1] - p1[1])
 x01 = (np.asarray(p0[0]) - p1[0])
 y01 = (np.asarray(p0[1]) - p1[1])
 u = (((x01 * x21) + (y01 * y21)) / float(abs(((x21 ** 2) + (y21 ** 2)))))
 u = np.clip(u, 0, 1)
 d = np.sqrt((((x01 - (u * x21)) ** 2) + ((y01 - (u * y21)) ** 2)))
 return d

def line2d_seg_dist ( p1 , p2 , p0 ) : x21 = ( p2 [ 0 ] - p1 [ 0 ] ) y21 = ( p2 [ 1 ] - p1 [ 1 ] ) x01 = ( np . asarray ( p0 [ 0 ] ) - p1 [ 0 ] ) y01 = ( np . asarray ( p0 [ 1 ] ) - p1 [ 1 ] ) u = ( ( ( x01 * x21 ) + ( y01 * y21 ) ) / float ( abs ( ( ( x21 ** 2 ) + ( y21 ** 2 ) ) ) ) ) u = np . clip ( u , 0 , 1 ) d = np . sqrt ( ( ( ( x01 - ( u * x21 ) ) ** 2 ) + ( ( y01 - ( u * y21 ) ) ** 2 ) ) ) return d
distance(s) from line defined by p1 - p2 to point(s) p0 p0[0] = x(s) p0[1] = y(s) intersection point p = p1 + u* and intersection point lies within segment if u is between 0 and 1 .