点到直线距离,以及垂足点

double xmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0)*(y2 - y0) - (x2 - x0)*(y1 - y0);
}
double area_triangle(double x1, double y1, double x2, double y2, double x3, double y3) {
return fabs(xmult(x1, y1, x2, y2, x3, y3)) / 2;
}
double dis_ptoline(double x1, double y1, double x2, double y2, double ex, double ey, double *px, double *py)
{ //第一个点,第二个点,目标点 ,p为垂足点, 返回距离
double k, b, dis, tem1, tem2, t1, t2, yd = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
t2 = sqrt((x2 - ex)*(x2 - ex) + (y2 - ey)*(y2 - ey));
t1 = sqrt((x1 - ex)*(x1 - ex) + (y1 - ey)*(y1 - ey));
dis = area_triangle(x1, y1, x2, y2, ex, ey) * 2 / yd;
tem1 = sqrt(t1*t1 - dis*dis);
tem2 = sqrt(t2*t2 - dis*dis);

if (tem1 > yd || tem2 > yd) {
if (t1 > t2) { *px = x2; *py = y2; return t2; }
else { *px = x1; *py = y1; return t1; }
}
*px = x1 + (x2 - x1)*tem1 / yd;
*py = y1 + (y2 - y1)*tem1 / yd;
return dis;
}

posted @ 2020-03-23 09:58  久龄  阅读(38)  评论(0编辑  收藏  举报