admin 发表于 2024-3-14 19:32:06

[每日一码] 通过两点的直线有部分在指定的多边形区域内,得到该区域

double lengthThroughRegion(CAD采用POINT* VertexPt,int VertexNum,
                           CAD采用POINT Pt1,CAD采用POINT Pt2)                           
{
    double length = 0;
    if (Pt1.distanceTo(Pt2) < 1e-6)
    {
      return length;
    }
    //避免与边线重合计算不准,将输入直线偏移
    //偏移值参照生成节线时,提高值1e-4
    Pt1.y -= 5e-5;
    Pt2.y -= 5e-5;

    //////////////////////////////////////////////////////////////////////////
    //普通情况
    int CrossNum=0;
    CAD采用POINT CrossPt;
    CAD采用POINT CPt;

    ads采用point adsPt;   
    //得到总的交点数
    int i; for( i=0;i<VertexNum;i++)
    {
      if(i==VertexNum-1)
      {
            //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt,CPt))
            if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt), 1,adsPt) == RTNORM)
            {
                CPt.set(adsPt,adsPt,adsPt);
                //因为加减了1e-6
                //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt,CPt))
                {
                  CrossPt=CPt;
                  CrossNum=CrossNum+1;
                }
            }
      }
      else
      {
            //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt,CPt))
            if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt), 1,adsPt) == RTNORM)
            {
                CPt.set(adsPt,adsPt,adsPt);
                //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt,CPt))
                {
                  CrossPt=CPt;
                  CrossNum=CrossNum+1;
                }
            }
      }
    }

    AcGePoint3dArray interArray;
    for (i = 0; i < CrossNum; i ++)//得到所有相异交点
    {
      BOOL bAdd = TRUE;
      for (int k = 0; k < interArray.length(); k ++)
      {
            if (interArray.distanceTo(CrossPt<i>) < 1e-6)
            {
                bAdd = FALSE;
            }
      }
      if (bAdd)
      {
            interArray.append(CrossPt<i>);
      }
    }




    AcGePoint3dArray vertArray;
    for (i = 0; i < VertexNum; i ++)
    {
      vertArray.append(VertexPt<i>);
    }
    vertArray.append(VertexPt);
    //////////////////////////////////////////////////////////////////////////
    for (i = 0; i < interArray.length()-1; i ++)
    {
      AcGePoint3d temp;
      temp.y = interArray<i>.y;
      temp.x = (interArray<i>.x + interArray.x)/2;
      //if (IsAtLines(VertexPt, VertexNum, temp) != 1)
      if (PointIsInPolygon(temp, vertArray) == 1)
      {
            length += interArray<i>.distanceTo(interArray);
      }
    }

    if (length < 1e-6)
    {
      CrossNum = 0;
      Pt1.y -= 2e-6;
      Pt2.y -= 2e-6;

      //////////////////////////////////////////////////////////////////////////
      //得到总的交点数
      int i; for( i=0;i<VertexNum;i++)
      {
            if(i==VertexNum-1)
            {
                //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt,CPt))
                if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt), 1,adsPt) == RTNORM)
                {
                  //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt,CPt))
                  {
                        CrossPt=CPt;
                        CrossNum=CrossNum+1;
                  }
                }
            }
            else
            {
                //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt,CPt))
                if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt), 1,adsPt) == RTNORM)
                {
                  //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt,CPt))
                  {
                        CrossPt=CPt;
                        CrossNum=CrossNum+1;
                  }
                }
            }
      }

      AcGePoint3dArray interArray;
      for (i = 0; i < CrossNum; i ++)//得到所有相异交点
      {
            BOOL bAdd = TRUE;
            for (int k = 0; k < interArray.length(); k ++)
            {
                if (interArray.distanceTo(CrossPt<i>) < 1e-6)
                {
                  bAdd = FALSE;
                }
            }
            if (bAdd)
            {
                interArray.append(CrossPt<i>);
            }
      }





      //////////////////////////////////////////////////////////////////////////
      for (i = 0; i < interArray.length()-1; i ++)
      {
            AcGePoint3d temp;
            temp.y = interArray<i>.y;
            temp.x = (interArray<i>.x + interArray.x)/2;

            if (PointIsInPolygon(temp, vertArray) == 1)
            {
                length += interArray<i>.distanceTo(interArray);
            }
      }
    }
    return length;
}
页: [1]
查看完整版本: [每日一码] 通过两点的直线有部分在指定的多边形区域内,得到该区域