请问如何选中一条画好的线段?

believe_me 2017-07-20 11:53:19
加精
我现在用宽度为5的画笔绘制了一条任意的线段,有弯曲。
请问我应该如何判断鼠标点击的点是在这个线段范围内?
非常感谢。
...全文
4131 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
零隐 2017-09-22
  • 打赏
  • 举报
回复
思路都给你了。 还没结贴啊。
VergilYe 2017-09-21
  • 打赏
  • 举报
回复
刚自己做的,你可以试试效果。

	BOOL CGDIPLine::IsHitLine( PointF ptStart,PointF ptEnd, CPoint ptMouse )
	{
		PointF ptOppositeLineEnd;	//对边的结束点  注意:OppositeLine的方向和Line的方向是相反的
		PointF ptOppositeLineStart;	//对边的起始点
		POINT  ptTempRng[4];
		float fWidth = 3* m_DrawPen.GetWidth();
		float fAdjacent=ptEnd.X-ptStart.X;	//邻边
		float fOpposite=ptEnd.Y-ptStart.Y;	//对边
		double dHeight=pow(pow((double)(ptStart.X-ptEnd.X),2)+pow((double)(ptStart.Y-ptEnd.Y),2),0.5);

		ptOppositeLineStart.X=(REAL)(ptEnd.X-fWidth*fOpposite/dHeight);
		ptOppositeLineStart.Y=(REAL)(ptEnd.Y+fWidth*fAdjacent/dHeight);
		ptOppositeLineEnd.X=(REAL)(ptStart.X-fWidth*fOpposite/dHeight);
		ptOppositeLineEnd.Y=(REAL)(ptStart.Y+fWidth*fAdjacent/dHeight);

		float fOffsetX=(ptOppositeLineEnd.X-ptStart.X)/2;		//求两点的中间点坐标
		float fOffsetY=(ptOppositeLineEnd.Y-ptStart.Y)/2;
		//RectOffset
		ptStart.X-=fOffsetX;
		ptStart.Y-=fOffsetY;
		ptEnd.X-=fOffsetX;
		ptEnd.Y-=fOffsetY;
		ptOppositeLineStart.X-=fOffsetX;
		ptOppositeLineStart.Y-=fOffsetY;
		ptOppositeLineEnd.X-=fOffsetX;
		ptOppositeLineEnd.Y-=fOffsetY;

		//按顺时针方向储存矩形四个点
		ptTempRng[UR].x=(LONG)ROUND(ptStart.X);
		ptTempRng[UR].y=(LONG)ROUND(ptStart.Y);

		ptTempRng[BR].x=(LONG)ROUND(ptEnd.X);
		ptTempRng[BR].y=(LONG)ROUND(ptEnd.Y);

		ptTempRng[BL].x=(LONG)ROUND(ptOppositeLineStart.X);
		ptTempRng[BL].y=(LONG)ROUND(ptOppositeLineStart.Y);

		ptTempRng[UL].x=(LONG)ROUND(ptOppositeLineEnd.X);
		ptTempRng[UL].y=(LONG)ROUND(ptOppositeLineEnd.Y);

		HRGN hLienRgn = CreatePolygonRgn(ptTempRng,4,WINDING);

		return PtInRegion(hLienRgn,ptMouse.x,ptMouse.y);
	}
零隐 2017-09-08
  • 打赏
  • 举报
回复
我给你个思路把,我以前做过,把线设置成向量有方向有角度。所以你点击一个位置的时候可以计算它的距离。向量的方法计算线段与点的距离。
jena_wy 2017-09-08
  • 打赏
  • 举报
回复
aiwin007 2017-09-08
  • 打赏
  • 举报
回复
一直寻找方法还没找到
  • 打赏
  • 举报
回复
上面的代码是有人写的博客。显然你的意思就是判断点在直线上 。
  • 打赏
  • 举报
回复
#include <iostream> #include <cstdio> using namespace std; struct point { double x; double y; }; bool onSegment(point Pi , point Pj , point Q) { if((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y) && min(Pi.x , Pj.x) <= Q.x && Q.x <= max(Pi.x , Pj.x) && min(Pi.y , Pj.y) <= Q.y && Q.y <= max(Pi.y , Pj.y)) return true; else return false; } int main() { point p1 , p2 , q; cin >> p1.x >> p1.y; cin >> p2.x >> p2.y; cin >> q.x >> q.y; if(onSegment(p1 , p2 , q)) cout << "Q点在线段P1P2内" << endl; else cout << "Q点不在线段P1P2内" << endl; } /* 1 0 4 0 3 0 Q点在线段P1P2内 */ /* 1 0 4 0 5 0 Q点不在线段P1P2内 */ /* 1 0 4 0 1 1 Q点不在线段P1P2内 */ /* 0 0 0 0 0 0 Q点在线段P1P2内 */ /* 0 0 0 0 1 0 Q点不在线段P1P2内 */
weixin_40146637 2017-09-07
  • 打赏
  • 举报
回复
这个很简单,只需要猜一猜
minziyu11 2017-08-18
  • 打赏
  • 举报
回复
学习了,讲的很好
xiaohuh421 2017-08-14
  • 打赏
  • 举报
回复
必须要把线相关的信息保存起来, 否则无法判断.
Solieyagai15409 2017-08-14
  • 打赏
  • 举报
回复
应该计算机图学习有判断直线的算法
qq_39835669 2017-08-13
  • 打赏
  • 举报
回复
学习劳动
.
hugh_z 2017-08-13
  • 打赏
  • 举报
回复
学习了.非常不错.
victor_woo 2017-08-12
  • 打赏
  • 举报
回复
引用 楼主 believe_me 的回复:
我现在用宽度为5的画笔绘制了一条任意的线段,有弯曲。 请问我应该如何判断鼠标点击的点是在这个线段范围内? 非常感谢。
既然有宽度,按线段数据构造矩形,如果多段就是多个矩形,然后判断鼠标点是否在矩形区域里面
ljheee 2017-08-11
  • 打赏
  • 举报
回复
应该计算机图学习有判断直线的算法
gw6328 2017-08-10
  • 打赏
  • 举报
回复
用颜色判断。
VergilYe 2017-08-10
  • 打赏
  • 举报
回复
楼主可以换个思路试试看: 1.已知线段位置(这里单纯指线段的路径)和鼠标当前位置。 2.求鼠标到线段的距离L(算法可自行百度) 3.当L < (笔宽/2 )时,则判断为选中。 不知道这种思路符不符合你的需求呢?
cattpon 2017-08-09
  • 打赏
  • 举报
回复
learning~
qq_17816881 2017-08-09
  • 打赏
  • 举报
回复
初来咋到,学习一下。
qq_37883888 2017-08-09
  • 打赏
  • 举报
回复
初来咋到,学习一下。
加载更多回复(14)
软件功能编辑 几何画板是适用于数学、平面几何、物理的矢量分析、作图,函数作图的动态几何工具。 《几何画板》软件是由美国Key Curriculum Press公司制作并出版的优秀教育软件,1996年该公司授权在中国发行该软件的中文版。正如其名“21世纪动态几何”,它能够动态地展现出几何对象的位置关系、运行变化规律,是数学与物理教师制作课件的“利剑”! 窗口 由题标栏、菜单栏、工具栏、状态栏、绘图窗口和记录窗口等组成。 工具栏 工具栏依次是选择工具(实现选择,及对象的平移、旋转、缩放功能)、画点工具、画线工具、画圆工具、文本工具和对象信息工具。在选择工具和画线工具按钮上按住鼠标左键停留片刻,会弹出更多的类型工具;选择对象的方法可以选择点按、按Shift点按或拖动等方式选中对象。 关系 几何画板中对象之间的关系如同生活中父母与子女关系。如果改变“父母”的位置或大小,为了保持与父母的几何关系,作为“子女”对象也随之变化。例如,我们先作出两个点,再作线段,那么作出的线段就是那两个点的“子女”。又如,先作一个几何对象,再基于这个对象用某种几何关系(平行、垂直等)或变换(旋转、平移等)作出另一个对象,那么后面作出的几何图形就是前面的“子女”。 信息工具 选择“信息工具”,然后在某个对象上单击或双击,即可显示有关信息或弹出该对象信息对话框。 基本操作编辑 点 例1 画三角形 先画三个点(可按住Shift键连续画点);然后利用“构造”菜单中的“线段”命令画出三角形。 注:用按住Shift键的方法,最大的好处是三个顶点都被选中。 例2 画多边形 先画多个点(可按住Shift键连续画点);然后利用“构造”菜单中的“线段”命令(或直接按CtrL+L)画出多边形。 注:选取顶点的顺序是十分重要的,不同的顺序会得出不同的多边形。 用几何画板画出圆的轨迹 用几何画板画出圆的轨迹 线 “画线工具”有三种线段、直线和射线,选中后在绘图窗口中进行画图即。 例3 制作验证三角形的三边的垂直平分线相交于一点的课件(初步进行作图练习) 圆 画圆有3种方法 用画圆工具作圆;通过两点作圆;用圆心与半径画圆(这种方法作的圆定长不变,除非改变定长时,否则半径不变) 圆弧 画圆弧也有3种方法 按一定顺序选定三点然后作弧(按逆时针方向从起点到终点画弧);选取圆及圆上2点作弧(从第一点逆时针方向到第二点之间的一段弧);选取圆上三点作弧(与法2相似,只是无需选中圆,作完弧后,可以隐藏原来的圆,可见新作的弧) 扇形和弓形 与三角形内部相似(先选中三个顶点),扇形和弓形含有“面”,而不仅仅只有“边界”。扇形和弓形的画法类似: 用上述方法作圆弧,选择该弧,用“作图”菜单中的“扇形内部”(或“弓形内部”)命令作出扇形或弓形(阴影部分)。 度量及计算 [度量] 选中三角形内部后,在“度量”菜单中“面积”和“周长”命令,度量三角形面积与周长。利用“显示”菜单中“参数选择”命令,可以进行“对象参数”设置。 [计算] “度量”菜单的“计算”命令可以对对象的值进行运算,求得所需要的结果,我们以“相交弦定理”验证为例进行说明。 ①画一个圆及两条相交的弦;②度量出四条线段的长度(距离);③分别选择同一直线上的两条线段的距离值,利用“度量”菜单中的计算命令,依次计算出两者之积④拖动动点,观察规律:相交弦定理。 制表 [制表] 在“度量”菜单中“制表”命令。选择上例中“四条线段的长度”,利用“制表”命令,制出表格。变化图形,增加表格项的方法有3种:选中表格菜单中“加项”命令;选中表格利用CtrL+E快捷键;双击表格。 变换 “变换”包括平移、旋转、缩放、反射等命令。各标记命令允许指定决定变换的几何对象、几何关系,或度量值。也可以通过组合平移、旋转、缩放、反射等变换定义自己的变换。 标记中心和标记镜面命令确定了几何变换的类型。旋转和缩放需要一个中心点,所以在实施这两种变换前要先确定一个中心点。同样,反射需要一个镜面,在反射前要先确定一个镜面。 标签 所谓标签,也就是给作出的点、线、圆、圆弧等几何图形起个名字。用几何画板作出的几何对象,一般都由系统自动配置好标签。利用“标签”工具双击标签文本可以进行重命名操作。 提高操作编辑 快速绘制 ①利用快捷键 如绘制多边形时,可先利用画点工具,画若干个点(顶点)。画点时按住Shift键,使之均处于选中状态,然后利用作线段快捷键命令CtrL+L,来快速完成多边形的绘制。 ②直接使用键盘命令创建图形对象 其实《几何画板》中提供了通过键盘命令(几个标点符号键)直接输入几何图形的方法。 句号( 。 ) —— 绘制点 逗号( , ) —— 绘制圆 斜杠( / ) —— 绘制线(包括线段、射线和直线,它们各类型之间可通过重复点击来切换) 分号( ;) —— 绘制圆弧 撇号( ’)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧