点到直线和到线段的最短距离


点到直线的距离:

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));//垂线距离
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值