繁体   English   中英

矩形算法中的多边形?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM