求一个函数
判断一个点是不是在多边形里的
[解决办法]
没这个函数吧?
还是自己写实现
或者google
[解决办法]
BOOL CGe::PtInPoly(CPoint3d pt,const CPoint3dArray& ptArrF,BOOL bIncludeEdage)
{
CPoint3dArray ptArr(ptArrF);
int iLen = ptArr.GetSize();
if (iLen < 3)
{
return FALSE;
}
// 首先构造最小包络面并得到最大 x 坐标
int i;
double dblMaxX = ptArr[0].x;
double dblMinX = ptArr[0].x;
double dblMaxY = ptArr[0].y;
double dblMinY = ptArr[0].y;
for (i = 1; i < iLen; i++)
{
if (ptArr[i].x > dblMaxX)
dblMaxX = ptArr[i].x;
if (ptArr[i].x < dblMinX)
dblMinX = ptArr[i].x;
if (ptArr[i].y > dblMaxY)
dblMaxY = ptArr[i].y;
if (ptArr[i].y < dblMinY)
dblMinY = ptArr[i].y;
}
//// 如果点位于最小包络面之外,则肯定不在区域内,直接返回 false
if (( pt.x > dblMaxX) ||
( pt.x < dblMinX) ||
( pt.y > dblMaxY) ||
( pt.y < dblMinY)
)
{
return FALSE;
}
// 循环求取交点
CPoint3d xpt, ipt;
xpt = pt;
xpt.x = dblMaxX + 10.0;
CPoint3d p1(ptArr[0]);
CPoint3d p2;
int nCount = 0;
BOOL bAppend = FALSE;
if (p1.isEqualTo(ptArr.last()) != TRUE)
{
CPoint3d pttmp = ptArr[0];
ptArr.Add(pttmp);
iLen++;
bAppend = TRUE;
}
for (i=1; i < iLen; i++)
{
p2 = ptArr[i];
// 如果所给点与顶点相等,直接返回
if (pt.isEqualTo(p1))
{
if(bIncludeEdage)
{
if (bAppend)
ptArr.removeLast();
return TRUE;
}
else
{
if (bAppend)
ptArr.removeLast();
return FALSE;
}
}
// 如果所给点在某一条边上,直接返回
if (PtInLine(pt.x,pt.y,pt.z,p1.x,p1.y,p1.z,p2.x,p2.y,p2.z))//(xlineseg3d.isOn(pt) == TRUE)
{
if(bIncludeEdage)
{
if (bAppend)
ptArr.removeLast();
return TRUE;
}
else
{
if (bAppend)
ptArr.removeLast();
return FALSE;
}
}
// 如果构造线段与交点存在,加入交点表
//此处在debug 和 release 时结果不一样
if (LineInterlace(pt.x,pt.y,pt.z,xpt.x,xpt.y,xpt.z,p1.x,p1.y,p1.z,p2.x,p2.y,p2.z,
ipt.x,ipt.y,ipt.z,TRUE))
{
// 如果交点正好为顶点,判断另外的端点在哪一侧
if (ipt.isEqualTo(p1))
{
if (p2.y > ipt.y)
nCount++;
}
else if(ipt.isEqualTo(p2))
{
if (p1.y > ipt.y)
nCount++;
}
else
nCount++;
}
p1 = p2;
}
if (bAppend)
ptArr.removeLast();
if ((nCount % 2) == 0)
{
return FALSE; // 交点数为偶数,不在区域内
}
else
{
return TRUE; // 交点数为奇数,在区域内
}
}