点在多边形中的c++算法实现
Point in Polygon C++ Algorithm implementation
我尝试了两种算法,这是其他StackOverflow问题的答案:
多边形内检查点
多边形算法中的点
两者都显示一些点in为out或out为in,而其他点是正确的。这个测试强制转换假设始终只有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
我在使用我发现的其他算法时也有类似的问题。如果有人能给我指出正确的方向,我将非常感激!
算法基于以下概念:
对于任何封闭多边形,任何直线的边缘都应该相交偶数次(不考虑线对线的情况)…
把它想象成(Enter, Exit, Enter, Exit,…)。
所以,如果你从你的测试点画一条线到无限大,取决于它开始的位置,如果点在外面,它应该相交偶数,如果点在里面,它应该相交奇数 !
正如我所看到的,通过测试用例和"4个顶点"注意:你正在寻找PointInRectangle(Coord c, Rect r)
更简单,更快,更合适。
对于(2,3) in (1,1)-(1,3)-(3,4)-(4,1) = TRUE
的测试用例它与你的底线是平行的,很可能是"被忽视",
但最有可能的是,与垂直方向的交叉点是由于浮点不准确性而存在的。
您应该将表达式分成几个部分,或者按原样调试它,看看计算出的实际值是什么。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?