自己想出来的,可能很多人已经会用,但希望对某些朋友有帮助。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;
}
{
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;
}
解决方案 »
- 如何让mfc读取数据库数据并且实现界面的绘制
- 300分求一个问题
- 关于A tool returned an error code from "Performing registration"的错误
- 如何使CTreeCtrl的checkbox只有二种选择状态
- matlab与vc混合编程的问题
- 请问如何在VC程序中实现DotNet中的那种分组的工具箱.
- 在这里提一个Java问题类型转换问题
- 一个很菜的关于enum 的问题?
- 关于workspace 中external dependencies 和 project 链接的加入
- 抓图的方式,求完整代码
- vc CListView header 颜色
- CEditView做记事本如何在另存为添加文件类型呢?
http://blog.csdn.net/yjukh/archive/2010/01/19/5213577.aspx
d=[A*x+B*y+C的绝对值]/[(A^2+B^2)的算术平方根]。
数学上简化一下,贴下我随手写的算法
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);
}
个人觉得不应该多算两点距离
比如判断点P是否在线段AB上
可以用斜率相等(K(AP) == K(AB)),而且可以转成乘积相减不用除。
也可以用|PA|+|PB| == |AB|,但觉得还是没有上面效率高。