- UID
- 5043
- 积分
- 1347
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-5-13
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
- 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,VertexPt[0],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
- {
- CPt.set(adsPt[0],adsPt[1],adsPt[2]);
- //因为加减了1e-6
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[0],CPt))
- {
- CrossPt[CrossNum]=CPt;
- CrossNum=CrossNum+1;
- }
- }
- }
- else
- {
- //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[i+1],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
- {
- CPt.set(adsPt[0],adsPt[1],adsPt[2]);
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,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) < 1e-6)
- {
- bAdd = FALSE;
- }
- }
- if (bAdd)
- {
- interArray.append(CrossPt);
- }
- }
- AcGePoint3dArray vertArray;
- for (i = 0; i < VertexNum; i ++)
- {
- vertArray.append(VertexPt);
- }
- vertArray.append(VertexPt[0]);
- //////////////////////////////////////////////////////////////////////////
- for (i = 0; i < interArray.length()-1; i ++)
- {
- AcGePoint3d temp;
- temp.y = interArray.y;
- temp.x = (interArray.x + interArray[i+1].x)/2;
- //if (IsAtLines(VertexPt, VertexNum, temp) != 1)
- if (PointIsInPolygon(temp, vertArray) == 1)
- {
- length += interArray.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,VertexPt[0],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[0]), 1,adsPt) == RTNORM)
- {
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,VertexPt[0],CPt))
- {
- CrossPt[CrossNum]=CPt;
- CrossNum=CrossNum+1;
- }
- }
- }
- else
- {
- //if(GetCrossPoint(Pt1,Pt2,VertexPt,VertexPt[i+1],CPt))
- if(acdbInters(asDblArray(Pt1), asDblArray(Pt2), asDblArray(VertexPt), asDblArray(VertexPt[i+1]), 1,adsPt) == RTNORM)
- {
- //if(IsAtLine(Pt1,Pt2,CPt)&&IsAtLine(VertexPt,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) < 1e-6)
- {
- bAdd = FALSE;
- }
- }
- if (bAdd)
- {
- interArray.append(CrossPt);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- for (i = 0; i < interArray.length()-1; i ++)
- {
- AcGePoint3d temp;
- temp.y = interArray.y;
- temp.x = (interArray.x + interArray[i+1].x)/2;
- if (PointIsInPolygon(temp, vertArray) == 1)
- {
- length += interArray.distanceTo(interArray[i+1]);
- }
- }
- }
- return length;
- }
|
|