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