找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 133|回复: 0

[每日一码] arx判断一点是否在多段线内

[复制链接]

1

主题

0

回帖

33

积分

管理员

积分
33
发表于 2024-3-14 20:44:31 | 显示全部楼层 |阅读模式
  1. bool CGePointUtil::IsInside(const AcGePoint3d &pt, AcDbPolyline* pPoly)
  2. {
  3.         bool isinside = false;
  4.         CPolylineUtil::clearDbPts(pPoly);  //去除相邻重复点
  5.         AcGePoint3dArray points,inPts;
  6.         AcGePoint3d pt3d;
  7.         AcDbExtents ext;
  8.         int num = pPoly->numVerts();
  9.         for (int i = 0; i < num; i++)
  10.         {
  11.                 pPoly->getPointAt(i, pt3d);
  12.                 points.append(pt3d);
  13.         }
  14.         ErrorStatus es= pPoly->getGeomExtents(ext);
  15.         double xDis = ext.maxPoint().x - ext.minPoint().x;
  16.         AcGeVector3d vec(xDis, 0, 0);
  17.         AcDbLine* pLine = new AcDbLine(pt, pt + vec);
  18.         if (pLine->intersectWith(pPoly,AcDb::kExtendArg,AcGePlane::kXYPlane,inPts)==Acad ::eOk)
  19.         {
  20.                 int len = inPts.length();
  21.                 if (len==0)
  22.                 {
  23.                         pLine->close();
  24.                         return isinside;
  25.                 }
  26.                 AcGePoint3d ptFront, ptBack;
  27.                 for (int j=0;j<inPts.length();j++)
  28.                 {
  29.                         pt3d = inPts.at(j);
  30.                         if (points.contains(pt3d))
  31.                         {
  32.                                 int index = points.find(pt3d);
  33.                                 ptFront = points.at(index - 1);
  34.                                 ptBack = points.at(index + 1);
  35.                                 AcGeVector3d vecFront(pt3d-ptFront);
  36.                                 AcGeVector3d vecBack(ptBack-pt3d);
  37.                                 while (vecFront.isParallelTo(vec))
  38.                                 {
  39.                                         AcGePoint3d ptTemp(ptFront);
  40.                                         ptFront = points.at(points.find(ptTemp) - 1);
  41.                                         vecFront=(AcGeVector3d(ptTemp - ptFront));
  42.                                 }
  43.                                 while (vecBack.isParallelTo(vec))
  44.                                 {
  45.                                         AcGePoint3d pttemp(ptBack);
  46.                                         ptBack = points.at(points.find(pttemp) + 1);
  47.                                         vecBack = (AcGeVector3d(ptBack - pttemp));
  48.                                 }
  49.                                 if (vec.crossProduct(vecFront).isCodirectionalTo(vec.crossProduct(vecBack)))
  50.                                 {
  51.                                         len += 2;
  52.                                 }
  53.                                 else
  54.                                 {
  55.                                         len += 1;
  56.                                 }
  57.                         }
  58.                 }
  59.                 if (len%2!=0)
  60.                 {
  61.                         isinside = true;
  62.                 }
  63.         }
  64.         pLine->close();
  65.         return isinside;
  66. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-29 21:04 , Processed in 0.124124 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表