点到直线的距离:
struct Node
{
int x,y;
};
double D(Node a,Node b,Node c)//计算点到直线距离
{
double d=(fabs((b.y-a.y)*c.x+(a.x-b.x)*c.y+((b.x*a.y)-(a.x*b.y))))/(sqrt(pow(b.y-a.y,2)+pow(a.x-b.x,2)));
return d;
}
点到线段的距离:
本质上和点到直线的距离求法是一样的,不过线段多了两种情况。求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上。
我们记m=AP * AB (向量点乘)n=AB * AB
显然
m<=0对应(c)最短距离为AP
m>=n对应(b)最短距离为BP
0<m<n对应(a)最短距离为垂线距离
struct Node
{
int x,y;
};
double D(Node a,Node b,Node p)//计算点到线段最短距离
{
double ap=(b.x-a.x)*(p.x-a.x)+(b.y-a.y)*(p.y-a.y);
if(ap<=0) return sqrt((p.x-a.x)*(p.x-a.x)+(p.y-a.y)*(p.y-a.y));//最短为ap
double ab=(b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y);
if(ap>=ab) return sqrt((p.x-b.x)*(p.x-b.x)+(p.y-b.y)*(p.y-b.y));//最短为bp
double r=ap/ab;
double px=a.x+(b.x-a.x)*r;
double py=a.y+(b.y-a.y)*r;
return sqrt((p.x-px)*(p.x-px)+(p.y-py)*(p.y-py));//垂线距离
}