这样,直线方程就变为y1x-x1y=0,点到直线距离公式也变为d=fabs(y1*x-x1*y)/sqrt(y1*y1+x1*x1),简单多了吧?
完了?还没有!如果这样判定就算完了的话,点击在直线的延长线上也会判定选中的!所以要确定如果不是点击在包含直线的rect中,则拾取无效。
该方法封装成函数如下:
bool isselline(cpoint p/*鼠标点击点*/,cpoint p1,cpoint p2/*直线的两个端点*/)
{
//如果点击不在区域中,则返回false
if(!ptinrect(crect((*x1<=x2?x1:x2)-5,
(y1<=y2?y1:y2)-5,
(x1>x2?x1:x2)+5,
(y1>y2?y1:y2)+5),p))
return false;
//坐标变换
p1.x-=p2.x;
p1.y-=p2.y;
p.x-=p2.x;
p.y-=p2.y;
p2.x=0;
p2.y=0;
//计算距离
double d=fabs(y1*p.x-x1*p.y)/sqrt(y1*y1+x1*x1);
if(d<5)return true;//误差值,也可以通过函数参数传进来。
return false;
}
如果没有mfc支持的程序,也可以定义成如下格式:
bool isselline(int x,int y/*鼠标点击点*/,int x1,int y1,int x2,int y2/*直线的两个端点*/)
好了,最好补一句:别忘了包含<math.h>