使用点积投影法求点到线段的距离

来自个人百度空间的文章---2012.2.19

引子:由于面试中需要问到这些问题,所以对一些平面几何的算法做个总结,而且由于有个面试官,竟然说使用叉积可以算点到线段之间的距离,这个当时我信以为真。即使面试中也保持思维活跃起来,不要滔滔不绝的讲,搞清楚面试官到底要干什么,一定要寻个为什么。

正文:

一、基本知识点

      点积:假设向量A,B.点积A*B=|A|*|B|*COS<A,B>=A.x*B.x+A.y*B.y;如果(A*B)/|B|,则结果为A在B上的投影。

二、C++代码

static double Pnt2SegmentDist(Point A, Point B, Point C,Point* pD = NULL)
{

     //AB为线段,C为点,pD为需要返回C距离AB最近的点,返回值为C到AB的距离

     //Dist为求两点之间的距离,第三个参数若是0不开方,若使用默认参数值1则需要开方。
     Point AB = B - A; //向量AB
     Point AC = C - A;
     double r = AB.x * AC.x + AB.y * AC.y;//AB与AC的点乘积
     r /= Dist(A,B,0);//AC在AB上的投影比上AB。调用Dist(),不开方
     //若C的投影在AB外
     if(r < 0)
     {
        if(pD)
          *pD = A;
         return Dist(A, C);//调用Dist(),开方
     }
     if(r > 1)
     {
       if(pD)
         *pD = B;
       return Dist(B, C);
     }
     //若C的投影在AB之间
     Point D = AB;
     D.x *= r;
     D.y *= r;//因为AB是向量,所以可以这样做。得到AC在AB上的投影向量。
     D.Offset(A);//点D的绝对坐标
     if(pD)
     {
       *pD = D;
     }
     return Dist(C, D);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值