Objectarx 判断点是否在多段线内部

//作用:判断点是否在多边形内
//p指目标点, ptPolygon指多边形的点集合, nCount指多边形的边数
bool COperaDeleteEntByPL::PtInPolygon (AcGePoint2d p, AcGePoint2dArray& ptPolygon, int nCount)
{
// 交点个数
int nCross = 0;
for (int i = 0; i < nCount; i++)
{
AcGePoint2d p1 = ptPolygon[i];
AcGePoint2d p2 = ptPolygon[(i + 1) % nCount];// 点P1与P2形成连线

if ( p1.y == p2.y )
continue;
if ( p.y < min(p1.y, p2.y) )
continue;
if ( p.y >= max(p1.y, p2.y) )
continue;
// 求交点的x坐标(由直线两点式方程转化而来)

double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;

// 只统计p1p2与p向右射线的交点
if ( x > p.x )
{
nCross++;
}

}

// 交点为偶数,点在多边形之外
// 交点为奇数,点在多边形之内
if ((nCross % 2) == 1)
return true;
else
return false;
}

posted @ 2020-04-21 15:28  久龄  阅读(372)  评论(0编辑  收藏  举报