本身的依据有两点
二维空间平移不影响结果
因为是点到直线的距离,所以取直线上任意两点,结果不变
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));
}呵呵,此法没有运行过,也没考虑太多的细节,心里想想就写出来了,见笑!~
二维空间平移不影响结果
因为是点到直线的距离,所以取直线上任意两点,结果不变
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));
}呵呵,此法没有运行过,也没考虑太多的细节,心里想想就写出来了,见笑!~
p1.x-p2.x=0
x*x+y*y=0
的时候很容易出问题...
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);
}