点到直线的距离可以直接做垂线求取,但线段是有首尾点的,若要求距离则要考虑首尾点。
点和线段的关系大致可以有下面几种
- double GetPointDistance(CPoint p1, CPoint p2)
- {
- return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
- }
- float GetNearestDistance(CPoint PA, CPoint PB, CPoint P3)
- {
- //----------图2--------------------
- float a,b,c;
- a=GetPointDistance(PB,P3);
- if(a<=0.00001)
- return 0.0f;
- b=GetPointDistance(PA,P3);
- if(b<=0.00001)
- return 0.0f;
- c=GetPointDistance(PA,PB);
- if(c<=0.00001)
- return a;//如果PA和PB坐标相同,则退出函数,并返回距离
- //------------------------------
- if(a*a>=b*b+c*c)//--------图3--------
- return b; //如果是钝角返回b
- if(b*b>=a*a+c*c)//--------图4-------
- return a; //如果是钝角返回a
- //图1
- float l=(a+b+c)/2; //周长的一半
- float s=sqrt(l*(l-a)*(l-b)*(l-c)); //海伦公式求面积,也可以用矢量求
- return 2*s/c;
- }