绘图程序中直线的拾取判断[2]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 involute 的 blog

这样,直线方程就变为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>


本文关键:直线 拾取
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top