我一直在考虑使用AcDbMPolygon类和isPointInsideMPolygon()来验证一个点是否在一条轻量级折线内,但是由于某种原因对我不起作用。
例如,我选择了一组多段线,如果我定义了一个内部点,我希望获得该多段线,即该内部点所在的位置。
下面是一个命令示例:
- static void LESQGBPoly17_GETPOLY(void)
- {
- ads_name sspol;
- resbuf *rbFilter = acutBuildList(RTDXF0, _T("LWPOLYLINE"), RTNONE);
- if (acedSSGet(NULL, NULL, NULL, rbFilter, sspol) != RTNORM)
- {
- acutRelRb(rbFilter); return;
- }
- acutRelRb(rbFilter);
- long len = 0;
- if ((acedSSLength(sspol, &len) != RTNORM) || (len == 0))
- {
- acedSSFree(sspol); return;
- }
- AcGePoint3d worldPt;
- if (acedGetPoint(NULL,_T("\nPick internal point: "),asDblArray(worldPt)) != RTNORM) return;
- for (int i=0; i pPoly(objId, AcDb::kForWrite);//for write test to erase, or color change
- if (pPoly.openStatus() == Acad::eOk)
- {
- acdbUcs2Wcs(asDblArray(worldPt),asDblArray(worldPt),false);
- AcGeVector3d vDir = AcGeVector3d::kZAxis;
- resbuf rb; acedGetVar(_T("viewdir"),&rb);
- vDir = asVec3d(rb.resval.rpoint);
- AcDb::Planarity plan_type;
- AcGePlane plane;
- pPoly->getPlane(plane,plan_type);
- worldPt = worldPt.project(plane,vDir);
- AcGeIntArray loopsArray; //loopsArray.setLogicalLength(0);
- if (mpol.appendLoopFromBoundary(pPoly) == Acad::eOk)
- {
- if ( mpol.isPointInsideMPolygon(worldPt, loopsArray) > 0)
- {
- acutPrintf(_T("\nPoint inside..."));
- pPoly.object()->setColorIndex(6);
- }
- }
- }
- }
- acedSSFree(sspol);
- }
但是,如果当我尝试在附着的图形中的洋红色多段线中定义内部点时,它不会返回true,除非我在isPointInsideMPolygon(worldPt,loopsArray,1.0)中更改容差以添加1.0,例如,它会返回该点在内部,但也会获得选择中的其他多段线(这是我不希望的)。所以现在,我很困惑...
有人有使用isPointInsideMPolygon()的经验吗?我知道Alexander Rivilis在这里发布的函数是_point_in_curve(),但它也有相同的结果...
谢谢!
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |