double msDistancePointToSegment(pointObj *p, pointObj *a, pointObj *b)
{//计算点到线段(a,b)的距离
double l; /* length of line ab */
double r,s;
l = msDistancePointToPoint(a,b);
if(l == 0.0) /* a = b */
return( msDistancePointToPoint(a,p));
r = ((a->y - p->y)*(a->y - b->y) - (a->x - p->x)*(b->x - a->x))/(l*l);
if(r > 1) /* perpendicular projection of P is on the forward extention of AB */
return(MS_MIN(msDistancePointToPoint(p, b),msDistancePointToPoint(p, a)));
if(r < 0) /* perpendicular projection of P is on the backward extention of AB */
return(MS_MIN(msDistancePointToPoint(p, b),msDistancePointToPoint(p, a)));
s = ((a->y - p->y)*(b->x - a->x) - (a->x - p->x)*(b->y - a->y))/(l*l);
return(fabs(s*l));
}
double msDistancePointToPoint(pointObj *a, pointObj *b)
{
double d;
double dx, dy;
dx = a->x - b->x;
dy = a->y - b->y;
d = sqrt(dx*dx + dy*dy);
return(d);
}