我有一个算法可以找到一个点是否在给定的多边形中:
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;
}
考虑到这一点,我怎么能检查它是否在一个矩形内由Ptopleft和Pbottomright而不是一个点定义?
由于
基本上你知道如何在Adobe Illustrator中拖动以选择属于选择矩形的所有对象吗?好吧,我的意思是。 -
答案 0 :(得分:3)
难道你不能在多边形的点之间找到最小和最大的x和y值,并检查是否有任何值在矩形的尺寸之外?
答案 1 :(得分:0)
EDIT2:哎呀,意思是水平,而不是垂直边缘。
EDIT3:糟糕#2,它通过避免检查水平边缘来处理水平边缘。但是,如果你交叉乘法,你也可以避免使用特殊的套管。
答案 2 :(得分:-1)
int isPointInRect( Point point, Point ptopleft, Point pbottomright) {
float xp[2] ;
xp[0] = ptopleft.x,
xp[1] = pbottomright.x;
float yp[2] ;
yp[0] = ptopleft.y ;
yp[1] = pbottomright.y ;
return CGlEngineFunctions::PointInPoly(2, xp, yp, point.x, point.y);
}
答案 3 :(得分:-1)
如前所述,对于该特定问题,此功能是一种矫枉过正。但是,如果您需要使用它,请注意:
1.它仅适用于凸多边形,
2.必须对包含多边形顶点的数组进行排序,使得数组中的连续点与多边形的相邻顶点相关。
3.要正常工作,顶点必须按“右手规则”顺序排序。这意味着当你开始沿着边缘“行走”时,你只能左转。
那就是说,我认为实施中存在错误。而不是:
// c initialized to 0 (false), then...
c = !c;
你应该有类似的东西:
// c initialized to 1 (true), then...
// negate your condition:
if ( ! (....))
c = 0;