BOOL PointIsInPolygon(AcGePoint3d pt, AcGePoint3dArray ptArr)
{
int ptNum, i, interNum;
AcGePoint3d ptA, ptB;
ads_point pt0, pt1, pt2, ptIns, ptX;
interNum = 0;
pt0[X] = 0.0;
pt0[Y] = 0.0;
pt0[Z] = 0.0;
ptX[X] = pt.x;
ptX[Y] = pt.y;
ptX[Z] = pt.z;
ptNum = ptArr.length();
for (i = 0;i < ptNum - 1;i++) {
ptA = ptArr.at(i);
ptB = ptArr.at(i + 1);
pt1[X] = ptA.x;
pt1[Y] = ptA.y;
pt1[Z] = 0.0;
pt2[X] = ptB.x;
pt2[Y] = ptB.y;
pt2[Z] = 0.0;
if(acdbInters(ptX, pt0, pt1, pt2, 1, ptIns) == RTNORM) {
interNum++;
}
}
if (interNum % 2 == 0) {
return false;
}
else {
return true;
}
}
此函数可判断一个点是否在一个点组围城的区域内。
采用的方式是用点做水平射线,然后计算和射线和点组的边的交点个数,奇书在内部,偶数在外部,这是一个定理。
注意:这个定理计算时不能有弧形,弧形可以拟合下再计算,一般情况下区别不大。