C++ 多边形C+中的点+;算法实现

C++ 多边形C+中的点+;算法实现,c++,algorithm,polygon,C++,Algorithm,Polygon,我尝试了两种算法,它们是其他StackOverflow问题的答案: 两人都将一些点显示为in as out或out as in,而其他点则是正确的。此测试强制转换假定始终只有4个顶点(矩形) 我在使用我发现的其他算法时也有类似的问题。如果有人能给我指出正确的方向,我会非常感激的,谢谢 该算法基于以下概念: 对于任何闭合多边形,任何直线都应与其边相交偶数次(不考虑线对线情况). 把它想象成(进入,退出,进入,退出,…) 因此,如果你从你的测试点画一条线到基本无穷大,这取决于它从哪里开始,如果测

我尝试了两种算法,它们是其他StackOverflow问题的答案:

两人都将一些点显示为in as out或out as in,而其他点则是正确的。此测试强制转换假定始终只有4个顶点(矩形)


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

该算法基于以下概念:
对于任何闭合多边形,任何直线都应与其边相交偶数次(不考虑线对线情况).
把它想象成(进入,退出,进入,退出,…)

因此,如果你从你的测试点画一条线到基本无穷大,这取决于它从哪里开始,如果测试点在外面,它应该相交偶数次,如果测试点在里面,它应该相交奇数

正如我看到的,通过测试用例和“4个顶点”注意:您正在寻找
PointInRectangle(坐标c,矩形r)
更简单、更快,而且看起来更合适

对于您的测试用例,其中(1,1)-(1,3)-(3,4)-(4,1)中的
(2,3)=TRUE

这与你的底线是平行的,很可能是“被忽视的”
但最有可能的是,与垂直线相交的原因是。

您应该将表达式拆分为多个部分,或者按原样对其进行调试,以查看其中计算的实际值。

解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。您正在除以
somepoint.y-someotherpoint.y
,您认为可以吗?如果差值为零呢?谢谢大家的建议!我设法得到了我需要的东西。我在第二个链接“多边形中的点算法”中使用了该算法,并意识到它的输出不包括形状外的点,而是包含形状内的所有点和形状上的一些点。因此,我将形状上的点从输出中移除,并获得所需的输出。
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;
}
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