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

believe_me 2017-07-20 11:53:19
加精
我现在用宽度为5的画笔绘制了一条任意的线段,有弯曲。
请问我应该如何判断鼠标点击的点是在这个线段范围内?
非常感谢。
...全文
4136 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,来快速完成多边形的绘制。 ②直接使用键盘命令创建图形对象 其实《几何画板》中提供了通过键盘命令(几个标点符号键)直接输入几何图形的方法。 句号( 。 ) —— 绘制点 逗号( , ) —— 绘制圆 斜杠( / ) —— 绘制线(包括线段、射线和直线,它们各类型之间可通过重复点击来切换) 分号( ;) —— 绘制圆弧 撇号( ’)
"以下哪个工具不可以用来绘制或者调整路径( )。 " "【线条工具】 " "【铅笔工具】 " "【选择工具】 " "【手形工具】 " "如果想要改变绘制图形的线条颜色,应该使用( )工具。 " "【铅笔工具】 " "【钢笔工具】 " "【墨水瓶工具】 " "【颜料桶工具】 " "如果想要使用【椭圆工具】绘制一个正圆,需要按住( )键。 " "Ctrl " "Alt " "Shift " "Ctrl+Alt " "要快速分离文本,可以使用( )组合键。 " "Ctrl+B " "Ctrl+G " "Ctrl+Shift " "Ctrl+F8 " "在Flash中,如果在【字母间距】文本框中输入-50,则会为选中的文本设 " "置字母间距为( )。 " "-50 " "100 " "0 " "50 " "使用( )组合键,可以打开【对齐】面板? " "Ctrl+B " "Ctrl+I " "Ctrl+T " "Ctrl+K " "Flash不支持的导入图像格式就是( )。 " "gif " "jpg " "bmp " "avi " "插入关键帧的快捷键就是( )。 " "F5 " "F6 " "F7 " "F8 " "在一个Flash动画中,最多可以创建( )个图层? " "50 " "100 " "200 " "以上都不对 " "Flash的图层不包括如下那种类型( )? " "引导图层 " "遮罩图层 " "普通图层 " "隐藏图层 " "【库】面板就是使用频率比较高的面板之一,打开【库】面板的快捷键为(" ")。 " "F11 " "Ctrl+L " "F8 " "Ctrl+K " "在实例的属性中,( )可以用于更改实例的透明度。 " "色调 " "Alpha " "亮度 " "均不可以 " "在按钮的四个状态帧中,( )帧为可以对鼠标做出响应的区域。 " "【弹起】 " "【按下】 " "【指针经过】 " "【点击】 " "在Flash中,不能直接作为遮罩层对象的就是( )。 " "图形 " "按钮 " "线条 " "文字 " "下列图层中哪种类型的图层不可以由普通图层转换得到( )。 " "引导层 " "被引导层 " "遮罩层 " "被遮罩层 " 简述在Flash中应用遮罩的技巧。 答:1、当需要使一个遮罩图层遮罩多个图层时,可通过下面两种方法实现: a)如果需要添加为被遮罩的图层位于遮罩图层上方,则选取该图层,然后将它拖到遮罩层 下方即可。 b)如果需要添加的图层位于遮罩层下方,可双击该图层图标,打开"图层属性"对话框,选择 "被遮罩"类型即可。 2、要取消被遮罩层同遮罩层之间的遮罩关系,即将被遮罩层设置为普通层,可通过两种方 法实现: a)将图层拖到遮罩层上面。 b)打开该图层的"图层属性"对话框,选择"一般"类型即可。利用该方法也可将遮罩层设为 普通层。 c)无论遮罩层上的对象使用何种颜色、透明度,以及何种图形类型,遮罩效果都一样。 d)要在Flash的舞台中显示遮罩效果,必须锁定遮罩层与被遮罩层。 e)在制作动画时,遮罩层上的对象经常挡住下层的对象,影响视线,为方便编辑,可以按下 遮罩层图层区的图标,当其变成形状时,遮罩层上的对象将只显示轮廓线。在此种情况下 ,也可以通过拖动边框调整遮罩图形的外形与位置。 简述引导路径动画的应用技巧。 答:(1)"被引导层"中的对象在被引导运动时,还可作更细致的设置,比如运动方向,在【属 性】面板上,选中【路径调整】复选框,对象的基线就会调整到运动路径。而如果选中【 对齐】复选框,元件的注册点就会与运动路径对齐。 (2)引导层中的内容在播放时就是瞧不见的,利用这一特点,可以单独定义一个不含"被引 导层"的"引导层",该引导层中可以放置一些文字说明、元件位置参考等。 (3)在做引导路径动画时,按下工具箱中的【对齐对象】按钮,可以使"对象 附着于引导线"的操作更容易成功,拖动对象时,对象的中心会自动吸附到路径端点上。 (4)过于陡峭的引导线可能使引导动画失败,而平滑圆润的线段有利于引导动画成功制作 。 (5)向被引导层中放入元件时,在动画开始与结束的关键帧上,一定要让元件的注册点对准 线段的开始与结束的端点,否则无法引导,如果元件为不规则形,可以点击工具箱中的【任 意变形工具】,调整注册点。 (6)如果想解除引导,可以把被引导层拖离"引导层",或在图层区的引导层上单击右键,在 弹出的菜单上选择【属性】,在对话框中选择"正常",作为正常图层类型。 (7)如果想让对象作圆周运动,可以在"引导层"画一根圆形线条,再用【橡皮擦工具】擦去 一小段,使圆形线段出现2个端点,再把对象的起始、终点分别对准端点即可。 (8)引导线允许重叠,比如螺旋状引导线,但在重叠处的线段必需保持圆润,让Flash

19,469

社区成员

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

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