【问题标题】:Point in Polygon C++ Algorithm implementation多边形 C++ 算法实现中的点
【发布时间】:2017-03-12 16:09:49
【问题描述】:

我尝试了两种算法,这些算法在其他 StackOverflow 问题中都有答案:

Check point within polygon

Point in Polygon Algorithm

两者都显示了一些点的出或出,而其他点是正确的。此测试转换假设始终只有 4 个顶点(矩形)

bool PointInPolygon(Coordinate point, vector<Coordinate> points) {
cout << "x,y" << point.getX() << "," << point.getY() << endl;
cout << "TEST COOR ARRAY" << endl;
for (int i=0; i<4; i++) {
    cout << points[i].getX() << "," << points[i].getY() << endl;
}
   
int i, j, nvert = points.size();
bool c = false;

for(i = 0, j = nvert - 1; i < nvert; j = i++) {
  if( ( (points[i].getY() > point.getY() ) != (points[j].getY() > point.getY()) ) &&
      (point.getX() < (points[j].getX() - points[i].getX()) * (point.getY() - points[i].getY()) / (points[j].getY() - points[i].getY()) + points[i].getX())
    )
    c = !c;
}

cout << c << "======================" << endl;

return c;
}

并且输出错误的是 (2,3) 和 (1,1) 不应该在其中。 周界上的线不被视为在。 但即便如此,那么 2,3 应该总是在里面。

x,y1,1
TEST COOR ARRAY
1,1
1,3
4,3
4,1
1======================
IN
x,y2,2
TEST COOR ARRAY
1,1
1,3
4,3
4,1
1======================
IN
x,y2,3
TEST COOR ARRAY
1,1
1,3
4,3
4,1
0======================
OUT
x,y3,2
TEST COOR ARRAY
1,1
1,3
4,3
4,1
1======================
IN
x,y3,3
TEST COOR ARRAY
1,1
1,3
4,3
4,1
0======================
OUT

我在使用我发现的其他算法时也遇到了类似的问题。如果有人能指出我正确的方向,我将不胜感激!

【问题讨论】:

  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 你除以somepoint.y-someotherpoint.y,你觉得可以吗?如果差值为零怎么办?
  • 感谢各位好心人的建议!我设法得到我需要的东西。我在第二个链接“Point in Polygon Algorithm”中使用了算法,并意识到它的输出不包含形状之外的点,而是包含所有点 IN 和形状上的一些点。因此,我从输出中删除了形状上的点并得到了我想要的输出。

标签: c++ algorithm polygon


【解决方案1】:

算法基于以下概念:
对于任何封闭的多边形,任何直线都应该与它的边缘相交偶数次(不考虑线对线的情况)...
把它想象成 (Enter, Exit, Enter, Exit, ...)。

所以,如果你从你的测试点画一条线到基本上无穷大,取决于它从哪里开始,如果点在外面,它应该相交 偶数次,并且 奇数 strong> 如果它在里面!

正如我所见,通过测试用例和“4 个顶点”说明:您正在寻找
PointInRectangle(Coord c, Rect r),它更简单、更快并且看起来很合适。

对于您的测试用例,(2,3) in (1,1)-(1,3)-(3,4)-(4,1) = TRUE
它与您的底线平行,并且很可能是“无视”,
但最有可能的是,由于Floating Point Inaccuracy,与您的垂直行业的交叉点就在那里。
您应该将表达式分成几部分,或者按原样调试它以查看那里计算出的实际值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2012-07-27
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多