【发布时间】:2017-03-12 16:09:49
【问题描述】:
我尝试了两种算法,这些算法在其他 StackOverflow 问题中都有答案:
两者都显示了一些点的出或出,而其他点是正确的。此测试转换假设始终只有 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 和形状上的一些点。因此,我从输出中删除了形状上的点并得到了我想要的输出。