如何判断一个点在CRgn路径附近?

hhhh63 2014-06-26 02:24:13
如何判断一个点在CRgn指定的路径附近?就是压在线上,不在里面,也不在外面。
...全文
174 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2014-06-26
  • 打赏
  • 举报
回复
引用 7 楼 fishion 的回复:
这时就可以创建圆点的Rgn,再用CombineRgn(..RGN_AND),如果返回值不为NULLREGION那说明在交汇处了
谢谢,这个办法非常好,不用四点了,直接用圆点就行,如果交集的结果不为空(不在外面),并且不等于圆点(不在里面),就表示在线的附近,结贴。Thanks again!
fishion 2014-06-26
  • 打赏
  • 举报
回复
引用 5 楼 hhhh63 的回复:
[quote=引用 4 楼 fishion 的回复:] 换个思路,如果一个点a(x,y)在rgn的边上,那对于a点的周围的四个点(x-1,y) ,(x + 1,y) , (x,y - 1 ) ,(x,y + 1),那么应该至少有一个点不在rgn里面的,(x,y)就必须要在rgn里,把这四个点用 PtInRegion判断下就行了
这个方法不错,不过也有一些问题,如果CRgn很窄,可能四个点都在外面。不知还有没有更好的办法,好多软件都有这样的功能,不知是怎么实现的?[/quote] 这时就可以创建圆点的Rgn,再用CombineRgn(..RGN_AND),如果返回值不为NULLREGION那说明在交汇处了
schlafenhamster 2014-06-26
  • 打赏
  • 举报
回复
"可能四个点都在外面" 就不是在 边上了
hhhh63 2014-06-26
  • 打赏
  • 举报
回复
引用 4 楼 fishion 的回复:
换个思路,如果一个点a(x,y)在rgn的边上,那对于a点的周围的四个点(x-1,y) ,(x + 1,y) , (x,y - 1 ) ,(x,y + 1),那么应该至少有一个点不在rgn里面的,(x,y)就必须要在rgn里,把这四个点用 PtInRegion判断下就行了
这个方法不错,不过也有一些问题,如果CRgn很窄,可能四个点都在外面。不知还有没有更好的办法,好多软件都有这样的功能,不知是怎么实现的?
fishion 2014-06-26
  • 打赏
  • 举报
回复
换个思路,如果一个点a(x,y)在rgn的边上,那对于a点的周围的四个点(x-1,y) ,(x + 1,y) , (x,y - 1 ) ,(x,y + 1),那么应该至少有一个点不在rgn里面的,(x,y)就必须要在rgn里,把这四个点用 PtInRegion判断下就行了
fishion 2014-06-26
  • 打赏
  • 举报
回复
换个思路,如果一个点a(x,y)在rgn的边上,那对于a点的周围的四个点(x-1,y) ,(x + 1,y) , (x,y - 1 ) ,(x,y + 1),那么应该至少有一个点不在rgn里面的,而至少有一个点在rgn里面,把这四个点用 PtInRegion判断下就行了
hhhh63 2014-06-26
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
CRgn::PtInRegion Checks whether the point given by x and y is in the region stored in the CRgn object.
这个是在路径的里面
schlafenhamster 2014-06-26
  • 打赏
  • 举报
回复
CRgn::PtInRegion Checks whether the point given by x and y is in the region stored in the CRgn object. BOOL PtInRegion( int x, int y ) const; BOOL PtInRegion( POINT point ) const;
CPaintDC dc(this); CWnd * pWnd = dc.GetWindow(); CWnd * item1; item1=this->GetDlgItem(IDC_STATIC1); CRect * rect=new CRect; item1->GetWindowRect(rect); POINT a,b; a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); CDC memDC; CBitmap cBitmap; BITMAP bitmap; cBitmap.LoadBitmap(IDB_BITMAP2); //通过资源标识加载图片 // HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"F:\\MFC\\duilian2\\res\\下联.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //通过文件路径加载图片 // cBitmap.Attach(hbmp); cBitmap.GetBitmap(&bitmap); maxh=bitmap.bmHeight; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x,a.y,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); //////////////////////////////////////////////////////////////////////////// CRgn rgn,temprgn; rgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+5,a.y+h+4); item1=this->GetDlgItem(IDC_STATIC2); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP1); cBitmap.GetBitmap(&bitmap); // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x-1,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+4,a.y+h+4); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////////////// item1=this->GetDlgItem(IDC_STATIC3); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP3); cBitmap.GetBitmap(&bitmap); maxw=bitmap.bmWidth; // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(b.x-2-bitmap.bmWidth,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.DeleteObject(); temprgn.CreateRectRgn(b.x-w,a.y,b.x,a.y+bitmap.bmHeight); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////// pWnd->SetWindowRgn(rgn,true); // pWnd->SetForegroundWindow(); rgn.DeleteObject(); temprgn.DeleteObject(); SetTimer(0,15,NULL); //CDialog::OnPaint();

19,468

社区成员

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

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