[英]Polygon in rectangle algorithm?
我有一个算法可以找到一个点是否在给定的多边形中:
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中拖动以选择属于选择矩形的所有对象吗? 好吧,我的意思是。 –
您难道不能只是在多边形的点之间找到最小和最大x和y值,然后检查是否有任何值不在矩形的尺寸范围内?
编辑:嗯,我误解了这个问题。 如果要确保多边形被矩形包围,请检查每个多边形点。 您可以使用最小/最大x和y坐标,并检查该矩形是否在查询矩形内,从而更便宜地完成该操作。
EDIT2:糟糕,表示水平边缘,而不是垂直边缘。
EDIT3:糟糕#2,它通过避免检查水平边缘来处理水平边缘。 但是,如果相乘,则也可以避免使用特殊大小写。
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);
}
如前所述,对于该特定问题,此功能过于强大。 但是,如果需要使用它,请注意:
1.仅适用于凸多边形
2.必须对包含多边形顶点的数组进行排序,以使数组中的连续点与多边形的相邻顶点相关。
3.为了正常工作,必须按照“右手法则”的顺序对顶点进行排序。 这意味着,当您开始沿边缘“行走”时,您只会向左转。
就是说,我认为实施中存在错误。 代替:
// c initialized to 0 (false), then...
c = !c;
您应该具有以下内容:
// c initialized to 1 (true), then...
// negate your condition:
if ( ! (....))
c = 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.