点到线段最短距离的算法

 

double computer(CPoint p1,CPoint p2,CPoint p0)
{
       double S;//S表示面积
       double distance1,distance2,distance3,distance;
    double sdis1,sdis2,sdis3;//距离平方
       double retValue ,temp;
       sdis1 = (p1.x-p0.x)*(p1.x-p0.x) + (p1.y-p0.y)*(p1.y-p0.y);
       sdis2 = (p2.x-p0.x)*(p2.x-p0.x) + (p2.y-p0.y)*(p2.y-p0.y);
       sdis3 = (p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y);
       distance1 = sqrt( sdis1 );//p1和p0之间的距离
       distance2 = sqrt( sdis2 );//p2和p0之间的距离
    distance3 = sqrt( sdis3 );//p2和p1之间的距离
 
       if( (distance1+distance2) == distance3 )//在线段内部
              distance= 0;
       else if( (distance1+distance3) == distance2 )//在p2p1的延长线上
              distance= distance1 ;
       else if( (distance2+distance3) == distance1 )//在p1p2的延长线上
              distance= distance2 ;
       else if( (sdis1+sdis3) < sdis2 )
        distance= distance1 ;
    else if( (sdis2+sdis3) < sdis1 )
        distance= distance2 ;      
       else
       {
               temp = (distance1 + distance2 +distance3)/2;
         S = sqrt(temp*(temp-distance1)*(temp-distance2)*(temp-distance3));
         distance= (2 * S) / distance3;
       }
    return distance;
      
}
浮点数比较按理是不应该用==的,不过似乎没出错,所以就将就了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值