| 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);
 }
 |