|
- 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[10];
- 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[0],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
- {
- CPt.set(adsPt[0],adsPt[1],adsPt[2]);
- //因为加减了1e-6
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt[0],CPt))
- {
- CrossPt[CrossNum]=CPt;
- CrossNum=CrossNum+1;
- }
- }
- }
- else
- {
- //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt[i+1],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
- {
- CPt.set(adsPt[0],adsPt[1],adsPt[2]);
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt[i+1],CPt))
- {
- CrossPt[CrossNum]=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[k].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[0]);
- //////////////////////////////////////////////////////////////////////////
- for (i = 0; i < interArray.length()-1; i ++)
- {
- AcGePoint3d temp;
- temp.y = interArray<i>.y;
- temp.x = (interArray<i>.x + interArray[i+1].x)/2;
- //if (IsAtLines(VertexPt, VertexNum, temp) != 1)
- if (PointIsInPolygon(temp, vertArray) == 1)
- {
- length += interArray<i>.distanceTo(interArray[i+1]);
- }
- }
- 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[0],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
- {
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt[0],CPt))
- {
- CrossPt[CrossNum]=CPt;
- CrossNum=CrossNum+1;
- }
- }
- }
- else
- {
- //if(GetCrossPoint(Pt1,Pt2,VertexPt<i>,VertexPt[i+1],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt<i>), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
- {
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt<i>,VertexPt[i+1],CPt))
- {
- CrossPt[CrossNum]=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[k].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[i+1].x)/2;
- if (PointIsInPolygon(temp, vertArray) == 1)
- {
- length += interArray<i>.distanceTo(interArray[i+1]);
- }
- }
- }
- return length;
- }
复制代码 |
|