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

believe_me 2017-07-20 11:53:19
加精
我现在用宽度为5的画笔绘制了一条任意的线段,有弯曲。
请问我应该如何判断鼠标点击的点是在这个线段范围内?
非常感谢。
...全文
4133 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)

19,468

社区成员

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

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