admin 发表于 2024-3-14 20:44:31

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

bool CGePointUtil::IsInside(const AcGePoint3d &pt, AcDbPolyline* pPoly)
{
      bool isinside = false;
      CPolylineUtil::clearDbPts(pPoly);//去除相邻重复点
      AcGePoint3dArray points,inPts;
      AcGePoint3d pt3d;
      AcDbExtents ext;
      int num = pPoly->numVerts();
      for (int i = 0; i < num; i++)
      {
                pPoly->getPointAt(i, pt3d);
                points.append(pt3d);
      }
      ErrorStatus es= pPoly->getGeomExtents(ext);
      double xDis = ext.maxPoint().x - ext.minPoint().x;
      AcGeVector3d vec(xDis, 0, 0);
      AcDbLine* pLine = new AcDbLine(pt, pt + vec);
      if (pLine->intersectWith(pPoly,AcDb::kExtendArg,AcGePlane::kXYPlane,inPts)==Acad ::eOk)
      {
                int len = inPts.length();
                if (len==0)
                {
                        pLine->close();
                        return isinside;
                }
                AcGePoint3d ptFront, ptBack;
                for (int j=0;j<inPts.length();j++)
                {
                        pt3d = inPts.at(j);
                        if (points.contains(pt3d))
                        {
                              int index = points.find(pt3d);
                              ptFront = points.at(index - 1);
                              ptBack = points.at(index + 1);
                              AcGeVector3d vecFront(pt3d-ptFront);
                              AcGeVector3d vecBack(ptBack-pt3d);
                              while (vecFront.isParallelTo(vec))
                              {
                                        AcGePoint3d ptTemp(ptFront);
                                        ptFront = points.at(points.find(ptTemp) - 1);
                                        vecFront=(AcGeVector3d(ptTemp - ptFront));
                              }
                              while (vecBack.isParallelTo(vec))
                              {
                                        AcGePoint3d pttemp(ptBack);
                                        ptBack = points.at(points.find(pttemp) + 1);
                                        vecBack = (AcGeVector3d(ptBack - pttemp));
                              }
                              if (vec.crossProduct(vecFront).isCodirectionalTo(vec.crossProduct(vecBack)))
                              {
                                        len += 2;
                              }
                              else
                              {
                                        len += 1;
                              }
                        }
                }
                if (len%2!=0)
                {
                        isinside = true;
                }
      }
      pLine->close();
      return isinside;
}
页: [1]
查看完整版本: [每日一码] arx判断一点是否在多段线内