一种快速求点到线段距离的算法

该博客介绍了如何计算点到线段的距离,特别考虑了线段的首尾点情况。算法通过判断点与线段相对位置,使用海伦公式避免了三角函数,实现了快速简洁的计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点到直线的距离可以直接做垂线求取,但线段是有首尾点的,若要求距离则要考虑首尾点。

    点和线段的关系大致可以有下面几种:


有特殊情况,是P点和AB重合,否则,根据PABPBA的角度可以有图1、图2、图4三种情况(包括点在AB之间,算是零度角)。

    我做的算法可以快速、简洁地判断角度是钝角还是锐角。

    在求垂线距离时,用海伦公式取代三角函数,使得程序看起来很简洁。

 

//P3到线段PA-PB的距离

float GetNearestDistance(CGPoint PA, CGPoint PB, CGPoint P3)

{

    

    //----------2--------------------

    float a,b,c;

    a = ccpDistance(PB, P3);

    if(a<=0.00001)

        return 0.0f;

    b = ccpDistance(PA,P3);

    if(b<=0.00001)

        return 0.0f;

    c = ccpDistance(PA,PB);

    if(c<=0.00001)

        return a;//如果PAPB坐标相同,则退出函数,并返回距离

    //------------------------------

    

    

    if(a*a>=b*b+c*c)//--------3--------

        return b;

    if(b*b>=a*a+c*c)//--------4-------

        return a;

    

    //1

    float l=(a+b+c)/2;     //周长的一半

    float s=sqrt(l*(l-a)*(l-b)*(l-c));  //海伦公式求面积

    return 2*s/c;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值