您的位置:首页 > 理论基础

计算机图形学—判断点在直线上的方法

2010-04-30 10:28 796 查看
做计算机图形学实验的时候,要捕获和拖动直线或者是图形的某一条边。

我们在寝室讨论如何判断鼠标在直线上的时候我的想法是扫描直线上的点再进行近似判断,在线上点附近就算是捕获直线了。

有个同学想到了用三角形两边之和大于第三的原理。第二天我就急忙实现了。

算法的思想是:

已知三角形两边之和大于第三边,当鼠标点在直线上时点到直线两端点的距离和等于直线的长度,
我们可以用点到两顶点的距离之和小于直线长度加上一个误差范围值(我选取的是0.5),
当符合要求的时候可以近似判定点就在直线上。

用MFC实现:
]/*********************判断鼠标是否在线上*****************************/
/*
*a b 为直线的两个端点
*c 鼠标点
********************************************************************/
bool CDrawLine::MouseOnLine(CPoint a, CPoint b, CPoint c)
{
double lac = sqrt((a.x - c.x)*(a.x - c.x) + (a.y - c.y)*(a.y - c.y));
double lbc = sqrt((b.x - c.x)*(b.x - c.x) + (b.y - c.y)*(b.y - c.y));
double lab = sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
return (lac + lbc < lab + 0.05) ? TRUE : FALSE;
}


同时给出判断捕获直线两个端点的方法:

]bool CDrawLine::MouseOnStartPoint(CPoint a, CPoint c)
{
return ((abs(a.x - c.x) < 4) &<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>& (abs(a.y - c.y) < 4)) ? TRUE : FALSE;
}
bool CDrawLine::MouseOnEndPoint(CPoint b, CPoint c)
{
return ((abs(b.x - c.x) < 4) && (abs(b.y - c.y) < 4)) ? TRUE : FALSE;
}


CDrawLine是自己写的类,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: