计算机图形学—判断点在直线上的方法
2010-04-30 10:28
796 查看
做计算机图形学实验的时候,要捕获和拖动直线或者是图形的某一条边。
我们在寝室讨论如何判断鼠标在直线上的时候我的想法是扫描直线上的点再进行近似判断,在线上点附近就算是捕获直线了。
有个同学想到了用三角形两边之和大于第三的原理。第二天我就急忙实现了。
算法的思想是:
已知三角形两边之和大于第三边,当鼠标点在直线上时点到直线两端点的距离和等于直线的长度,
我们可以用点到两顶点的距离之和小于直线长度加上一个误差范围值(我选取的是0.5),
当符合要求的时候可以近似判定点就在直线上。
用MFC实现:
同时给出判断捕获直线两个端点的方法:
CDrawLine是自己写的类,
我们在寝室讨论如何判断鼠标在直线上的时候我的想法是扫描直线上的点再进行近似判断,在线上点附近就算是捕获直线了。
有个同学想到了用三角形两边之和大于第三的原理。第二天我就急忙实现了。
算法的思想是:
已知三角形两边之和大于第三边,当鼠标点在直线上时点到直线两端点的距离和等于直线的长度,
我们可以用点到两顶点的距离之和小于直线长度加上一个误差范围值(我选取的是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是自己写的类,
相关文章推荐
- 计算机图形学—判断点在直线上的方法(转)
- [置顶] 【计算机图形学】【加权区域采样】用加权区域采样的方法绘制反走样直线
- 计算机图形学(1)——直线生成算法的实现
- 判断一个点是否在一条直线上的方法
- 计算机图形学-基于OpenGL的直线扫描程序
- 判断计算机字节存储顺序的方法(Big-endian或Little-endian)
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)
- 计算机图形学——直线的三种扫描转换算法
- 判断一个计算机是不是域主机的几个方法
- 计算机图形学——绘制直线
- 计算机图形学——MFC和OpenGL两种方法实现光照模型
- 计算机图形学——生成直线的DDA算法
- 计算机图形学考试-绘制一条任意线型和线宽的直线。
- 计算机图形学——直线扫描转换基本增量法
- Python判断直线和矩形是否相交的方法
- 判断 某一点在直线左右侧 方法
- 计算机图形学—DDA直线生成算法
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)
- 计算机图形学-基于OpenGL的绘制直线及图形变换练习
- 计算机图形学-直线的生成算法