c++ - 帮助这个算法

标签 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;
 }

我唯一的问题是它采用奇数缠绕规则。我的意思是,如果多边形是自相交的,它会被认为是“空”的某些部分将返回为假。即使它自相交,我也需要什么,多边形内的任何东西都会返回 true。

谢谢

最佳答案

注意:此答案错误。我现在没有时间修复它,但请参阅评论。

这会从该点向无穷远处转换一条射线,并检查与多边形每条边的交点。每次找到交叉点时,标志 c 都会切换:

c = !c;

所以偶数个交叉点意味着偶数个切换,所以 c 最后将为 0。奇数个交叉点意味着奇数个切换,因此 c 将为 1。

您想要的是在发生任何交集时设置c标志:

c = 1;

为了更好的衡量,您可以完全消除 c,并提前终止:

 int CGlEngineFunctions::PointInPoly(int npts, float *xp, float *yp, float x, float y)
 {
     int i, j;
     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]))
             return 1;
     }
     return 0;
 }

关于c++ - 帮助这个算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3442824/

相关文章:

c - 何时使用具有最大值的数组以及何时进行 malloc

algorithm - RTS游戏中视线计算的快速算法

algorithm - 算法的最佳和最坏情况运行时间

c++ - 当运行时属性名称未知时,按属性对 C++ 对象进行通用聚合

c++ - _Unwind_SjLj_Unregister 和 _Unwind_SjLj_Register 是什么?

c++ - 什么时候应该使用 zmq_msg_t?

c++ - 如何确定 C++ 中实例化容器模板的容器模板类型

c - 内核模块中变量已定义但未使用消息

c - 使用 Win32 API 将自定义边框添加到另一个应用程序

标记三角形网格边的算法