[每日一码] 通过两点的直线有部分在指定的多边形区域内,得到该区域
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]