指向Polygon C ++算法实现

时间:2016-10-30 09:13:48

标签: c++ algorithm polygon

我尝试了两种算法,这些算法是其他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

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

1 个答案:

答案 0 :(得分:0)

算法基于以下概念:
对于任何闭合的多边形,任何直线应该与它的边相交偶数次(不考虑线上线的情况)...

把它想象成(进入,退出,回车,退出......)。

所以,如果你从你的测试点绘制一条线到基本无穷大,取决于它开始的位置,如果该点在外面,它应该与偶数相交,并且奇数如果是的话!

正如我所看到的,通过测试用例和&#34; 4顶点&#34;注意:你正在寻求
PointInRectangle(Coord c, Rect r)更简单,更快速,更合适。

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