【发布时间】:2011-03-27 10:46:50
【问题描述】:
我有一个算法可以判断一个点是否在多边形内。
int CGlEngineFunctions::PointInPoly(int npts, float *xp, float *yp, float x, float y)
{
int i, j, c = 0;
for (i = 0, j = npts-1; i < npts; j = i++) {
if ((((yp[i] <= y) && (y < yp[j])) ||
((yp[j] <= y) && (y < yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}
我唯一的问题是它假设了一个奇怪的缠绕规则。我的意思是,如果多边形是自相交的,那么它会被认为是“空”的某些部分将返回为假。即使它自相交,我也需要它,多边形内的任何东西都会返回 true。
谢谢
【问题讨论】:
-
也许你可以重新排列点,这样你绘制它们的顺序就不会自相交?
-
不,我的应用程序是矢量图形,它允许不同种类的缠绕规则
-
该算法基于Jordon曲线定理。基本上有 2 个空间与有界对象相关联 - 进或出。从所讨论的点投射光线将与边界相交奇数或偶数次。如果它是奇数则该点在边界内,如果它是偶数则该点在边界外。此外,这个特定版本的算法假设基于投射的光线是水平的这一事实进行了简单的优化。