矩形算法中的多边形?

时间:2010-08-10 21:10:41

标签: c++ c 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中拖动以选择属于选择矩形的所有对象吗?好吧,我的意思是。 -

4 个答案:

答案 0 :(得分:3)

难道你不能在多边形的点之间找到最小和最大的x和y值,并检查是否有任何值在矩形的尺寸之外?

答案 1 :(得分:0)

编辑:呃,我误解了这个问题。如果要确保多边形由矩形包围,请检查每个多边形点。您可以使用最小/最大x和y坐标更便宜地执行此操作,并检查该矩形是否在查询矩形内。

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;