乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 339|回复: 14

[编程交流] AcDb MPolygon-MPolygon内部的点可靠吗?

[复制链接]

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-6-23 11:34:36 | 显示全部楼层 |阅读模式
我一直在考虑使用AcDbMPolygon类和isPointInsideMPolygon()来验证一个点是否在一条轻量级折线内,但是由于某种原因对我不起作用。
例如,我选择了一组多段线,如果我定义了一个内部点,我希望获得该多段线,即该内部点所在的位置。
下面是一个命令示例:
  1.         static void LESQGBPoly17_GETPOLY(void)
  2.         {
  3.                 ads_name sspol;
  4.                 resbuf *rbFilter = acutBuildList(RTDXF0, _T("LWPOLYLINE"), RTNONE);
  5.                 if (acedSSGet(NULL, NULL, NULL, rbFilter, sspol) != RTNORM)
  6.                 {
  7.                         acutRelRb(rbFilter); return;
  8.                 }
  9.                 acutRelRb(rbFilter);
  10.                 long len = 0;
  11.                 if ((acedSSLength(sspol, &len) != RTNORM) || (len == 0))
  12.                 {
  13.                         acedSSFree(sspol); return;
  14.                 }
  15.                 AcGePoint3d worldPt;
  16.                 if (acedGetPoint(NULL,_T("\nPick internal point: "),asDblArray(worldPt)) != RTNORM) return;
  17.                 for (int i=0; i pPoly(objId, AcDb::kForWrite);//for write test to erase, or color change
  18.                         if (pPoly.openStatus() == Acad::eOk)
  19.                         {
  20.                                 acdbUcs2Wcs(asDblArray(worldPt),asDblArray(worldPt),false);
  21.                                 AcGeVector3d vDir = AcGeVector3d::kZAxis;
  22.                                 resbuf rb; acedGetVar(_T("viewdir"),&rb);
  23.                                 vDir = asVec3d(rb.resval.rpoint);
  24.                                 AcDb::Planarity plan_type;
  25.                                 AcGePlane plane;
  26.                                 pPoly->getPlane(plane,plan_type);
  27.                                 worldPt = worldPt.project(plane,vDir);
  28.                                 AcGeIntArray loopsArray; //loopsArray.setLogicalLength(0);
  29.                                 if (mpol.appendLoopFromBoundary(pPoly) == Acad::eOk)
  30.                                 {
  31.                                         if ( mpol.isPointInsideMPolygon(worldPt, loopsArray) > 0)
  32.                                         {
  33.                                                 acutPrintf(_T("\nPoint inside..."));
  34.                                                 pPoly.object()->setColorIndex(6);
  35.                                         }
  36.                                 }
  37.                         }
  38.                 }
  39.                 acedSSFree(sspol);
  40.         }


但是,如果当我尝试在附着的图形中的洋红色多段线中定义内部点时,它不会返回true,除非我在isPointInsideMPolygon(worldPt,loopsArray,1.0)中更改容差以添加1.0,例如,它会返回该点在内部,但也会获得选择中的其他多段线(这是我不希望的)。所以现在,我很困惑...
有人有使用isPointInsideMPolygon()的经验吗?我知道Alexander Rivilis在这里发布的函数是_point_in_curve(),但它也有相同的结果...
谢谢!

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-6-24 23:33:12 | 显示全部楼层
乐,我有一个vba版本,但我还在努力把它转换成C#。
http://soft surfer . com orientation 2d _ Polygon()具有用于直线的数学运算
并且我添加了用于曲线的数学运算。
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-6-25 00:25:46 | 显示全部楼层
这可能与多边形的“缠绕”有关吗,即。它的顶点与围绕它的其他多边形的方向相反?如果是这种情况,那么它周围的所有多边形都将返回true。
只是一个猜测,但由于红色多边形在所有其他多边形中,这是您之前的多边形函数的结果,您可能需要反转顶点?
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
361
发表于 2007-6-25 09:10:07 | 显示全部楼层

布莱科
我将研究该链接……我为我的gbpoly项目完成了一些功能,这些功能对这一点很有用,我希望它使用ARX类中可用的功能。
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
361
发表于 2007-6-25 09:11:40 | 显示全部楼层

你好,米克;
根据adesk的arx新闻组中Alexander Rivilis的回答,似乎或者更确切地说,这是类中的一个错误。
谢谢!
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-6-25 09:56:14 | 显示全部楼层
半年前,我将此错误发布到ADN。有趣的是,在AutoCAD 2006中,此代码可以毫无问题地工作。新版本-新错误...
P. S.:尝试此代码:
  1. static void BrepPointCheckPoint(void)
  2. {
  3.   Acad::ErrorStatus es;
  4.   AcBr::ErrorStatus ebr;
  5.   ads_name en;
  6.   ads_point pt;
  7.   if (acedEntSel(_T("\nSelect contour: "), en, pt) != RTNORM)
  8.     return;
  9.   AcDbObjectId eId; acdbGetObjectId(eId,en);
  10.   AcDbObjectPointer pline(eId,AcDb::kForRead) ;
  11.   if ((es = pline.openStatus()) != Acad::eOk) {
  12.     acutPrintf(_T("\npline.openStatus()=%s"),acadErrorStatusText(es));
  13.     return;
  14.   }
  15.   if (acedGetPoint(pt,_T("\nPick point: "), pt) != RTNORM)
  16.     return;
  17.   AcDbVoidPtrArray ar, regions;
  18.   ar.append(pline.object());
  19.   if ((es = AcDbRegion::createFromCurves(ar,regions)) != Acad::eOk)  {
  20.     acutPrintf(_T("\nAcDbRegion::createFromCurves(ar,regions)=%s"),acadErrorStatusText(es));
  21.     return;
  22.   }
  23.   AcDbRegion reg; reg.copyFrom((AcDbRegion *)regions[0]);
  24.   for (int i=0; i<regions.length();i++) delete regions[i];
  25.   AcBrBrep brEnt;  ebr = brEnt.set(reg);
  26.   if (ebr != AcBr::eOk) {
  27.     acutPrintf(_T("\nbrEnt.set(sol)=%s"),acadErrorStatusText((Acad::ErrorStatus)(Adesk::UInt32)ebr));
  28.     return;
  29.   }
  30.   AcGe::PointContainment pDesc;
  31.   AcBrEntity *pCont = NULL;
  32.   AcBrBrepFaceTraverser brepFaceTrav; brepFaceTrav.setBrep(brEnt);
  33.   AcBr::ErrorStatus err = AcBr::eInvalidInput;
  34.   while (!brepFaceTrav.done()) {
  35.    AcBrFace brFace; brepFaceTrav.getFace(brFace);
  36.    err = brFace.getPointContainment(asPnt3d(pt),pDesc,pCont);
  37.    if (err == Acad::eOk && pDesc == AcGe::kInside) {
  38.      acedAlert(_T("In")); return;
  39.    } else if (err == Acad::eOk && pDesc == AcGe::kOnBoundary) {
  40.      acedAlert(_T("On")); return;
  41.    }
  42.    brepFaceTrav.next();
  43.   }
  44.   if (err == Acad::eOk) {
  45.     acedAlert(_T("Out"));
  46.   } else {
  47.     acedAlert(_T("Unknown error"));
  48.   }
  49.   return;
  50. }

回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2007-6-25 10:27:22 | 显示全部楼层
谢谢你,亚历山大
我稍后在家里尝试一下……我发现需要使用区域……
是的,它们会打开一个新孔来覆盖上一个孔……(用于虫子)
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
361
发表于 2007-6-26 17:45:45 | 显示全部楼层
这是我最终使用的,它基于John F. Uhden
的算法编辑:函数isPointIn()现在可以用于封闭曲线类对象-Polyline(样条和拟合),LWPolyline(样条和拟合),圆圈和样条,添加了更多控件。-上传为CPP文件
LE!
回复

使用道具 举报

170

主题

1424

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2119
发表于 2007-6-28 01:00:23 | 显示全部楼层
在完成上一个函数之后,现在我已经能够提出自己的边界/ bpoly命令,名为GETPOLY,如果可以的话,看看正在进行的结果......现在我需要知道如何为C#传递这个新函数...
回复

使用道具 举报

28

主题

249

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
361
发表于 2007-6-28 01:14:53 | 显示全部楼层
对猫来说很酷路易斯
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 04:10 , Processed in 0.221684 second(s), 88 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表