自己想出来的,可能很多人已经会用,但希望对某些朋友有帮助。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;
 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;
}

解决方案 »

  1.   

    图片太大了,看不清可以到我的空间看:
    http://blog.csdn.net/yjukh/archive/2010/01/19/5213577.aspx
      

  2.   

    不用这么麻烦吧,使用点到直线的距离公式不就行了。
    d=[A*x+B*y+C的绝对值]/[(A^2+B^2)的算术平方根]。
      

  3.   

    en  xuexi le  zhenbu cuo a 
      

  4.   

    原则上应该只需要一次开方,这个算法效率太低了。
    数学上简化一下,贴下我随手写的算法
    float GetNearestDistance(CPoint PA, CPoint PB, CPoint P3)
    {
    CPoint p1,p2;
    ASSERT(PA!=PB);//两点相等的话就不存在直线,没有意义
    p1 = PA-P3;//二维空间平移,p3成为原点
    p2 = PB-P3;
    float x,y,dis;  
    if (p1.y == p2.y)
    {
    dis = p1.y;
    }
    else if (p1.x == p2.x)
    {
    dis = p1.x;
    }
    else
    {     //计算直线与x轴y轴的交点
    x = (p2.x-p1.x)/(p1.y-p2.y)+p1.y;
    y = (p2.y-p1.y)/(p1.x-p2.x)+p1.x;
    float p1p2 = sqrt(x*x+y*y);
    if (p1p2<0.00001)
    {
    dis = 0;
    }
    else
    {
    dis = x*y/p1p2;
    }
    }
    return abs(dis);
    }
      

  5.   

    这样做精度会有损失吧。
    个人觉得不应该多算两点距离
    比如判断点P是否在线段AB上
    可以用斜率相等(K(AP) == K(AB)),而且可以转成乘积相减不用除。
    也可以用|PA|+|PB| == |AB|,但觉得还是没有上面效率高。
      

  6.   

    效率太低了,向量才是王道,三点坐标(x0,y0)(x1,y1)(x2,y2),面积=((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/2