点到直线的距离可以直接做垂线求取,但线段是有首尾点的,若要求距离则要考虑首尾点。
点和线段的关系大致可以有下面几种:
有特殊情况,是P点和A或B重合,否则,根据∠PAB或∠PBA的角度可以有图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;//如果PA和PB坐标相同,则退出函数,并返回距离
//------------------------------
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;
}