c - 如何检查点 (x,y) 是否在笛卡尔坐标系中的多边形内?

标签 c algorithm math polygon computational-geometry

<分区>

This question already has an answer here:
Point in Polygon aka hit test
C# Point in polygon

给定一个在笛卡尔坐标系中用 N 个线性方程制定的随机多边形,是否有任何标准公式可用于检查点 (x,y) 的隶属度?

简单的解决方案是获取所有的线公式并检查点 X 是否在这条线下方、该线上方和另一条线的右侧等。但这可能会很乏味。

我应该注意,多边形可以是任何形状,边数不限,可以是凹的也可以是凸的。

为方便起见,我已经添加了这些实用函数:

float slope(CGPoint p1, CGPoint p2)
{
    return (p2.y - p1.y) / (p2.x - p1.x);
}

CGPoint pointOnLineWithY(CGPoint p, float m, float y)
{
    float x = (y - p.y)/m + p.x;
    return CGPointMake(x,y);
}

CGPoint pointOnLineWithX(CGPoint p, float m, float x)
{
    float y = m*(x - p.x) + p.y;
    return CGPointMake(x, y);
}

最佳答案

如果您有顶点,则可以计算测试点与构成多边形的每对点之间的角度之和。 如果是2*pi,那么就是一个内点。如果为0,则为外点。

部分代码:

    typedef struct {
   int h,v;
} Point;

int InsidePolygon(Point *polygon,int n,Point p)
{
   int i;
   double angle=0;
   Point p1,p2;

   for (i=0;i<n;i++) {
      p1.h = polygon[i].h - p.h;
      p1.v = polygon[i].v - p.v;
      p2.h = polygon[(i+1)%n].h - p.h;
      p2.v = polygon[(i+1)%n].v - p.v;
      angle += Angle2D(p1.h,p1.v,p2.h,p2.v);
   }

   if (ABS(angle) < PI)
      return(FALSE);
   else
      return(TRUE);
}

/*
   Return the angle between two vectors on a plane
   The angle is from vector 1 to vector 2, positive anticlockwise
   The result is between -pi -> pi
*/
double Angle2D(double x1, double y1, double x2, double y2)
{
   double dtheta,theta1,theta2;

   theta1 = atan2(y1,x1);
   theta2 = atan2(y2,x2);
   dtheta = theta2 - theta1;
   while (dtheta > PI)
      dtheta -= TWOPI;
   while (dtheta < -PI)
      dtheta += TWOPI;

   return(dtheta);
}

来源:http://paulbourke.net/geometry/insidepoly/

其他你可以看看的地方: http://alienryderflex.com/polygon/

http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

http://sidvind.com/wiki/Point-in-polygon:_Jordan_Curve_Theorem

关于c - 如何检查点 (x,y) 是否在笛卡尔坐标系中的多边形内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10673740/

相关文章:

c# - 将数字转换为字母组合

c - 帕斯卡三角形

c# - 整数的 Math.Floor

c - 为什么这两个字符串在c中不相等

c - 如何打印进程在 C 中使用的内存的每个字节?

c - 使用时间溢出中断时出现故障

python - python中没有重复字符的最长子串

algorithm - 销售数据平滑平均

c - 我们如何计算多重集的 r 组合?

arrays - 初始化动态分配的 bool 二维数组的最佳方法是什么?