本身的依据有两点
二维空间平移不影响结果
因为是点到直线的距离,所以取直线上任意两点,结果不变
float GetNearestDistance(CPoint PA, CPoint PB, CPoint P3)
{
CPoint p1,p2;//二维空间的平移,使P3成为原点
p1 = PA-P3;
p2 = PB-P3;
float x,y;  //求出直线与x轴和y轴相交的点
x = (p2.x-p1.x)*p1.y/(p1.y-p2.y); //x=(x1-x2)*(-y1)/(y1-y2)
y = (p2.y-p1.y)*p1.x/(p1.x-p2.x); 
return abs(x*y/sqrt(x*x+y*y));
}呵呵,此法没有运行过,也没考虑太多的细节,心里想想就写出来了,见笑!~

解决方案 »

  1.   

    p1.y-p2.y=0
    p1.x-p2.x=0
    x*x+y*y=0
    的时候很容易出问题...
      

  2.   

    重新发一次吧。方法没变,加了一些判断。
    float GetNearestDistance(CPoint PA, CPoint PB, CPoint P3)
    {
    CPoint p1,p2;
    ASSERT(PA!=PB);//两点相等的话就不存在直线,没有意义
    p1 = PA-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 = (p2.x-p1.x)/(p1.y-p2.y)+p1.y;
    y = (p2.y-p1.y)/(p1.x-p2.x)+p1.x;
    if ((x<=0.00001)&&(y<=0.00001))
    {
    dis = 0;
    }
    else
    {
    dis = x*y/sqrt(x*x+y*y);
    }
    }
    return abs(dis);
    }