c++ - boost::polygon_90_data 无法处理面积值为 0 的多边形?

标签 c++ boost polygon boost-polygon

我的多边形有整数坐标,可能像一条线,我发现 boost::polygon_90_data 可以处理其中的一些,但这个不能:

namespace gtl = boost::polygon;
typedef gtl::polygon_90_data<int> Polygon;
typedef gtl::polygon_traits<Polygon>::point_type Point;
Polygon poly;

Point pts5[] = { Point(100, 200), Point(200, 200), Point(200, 400), Point(200, 200), Point(100, 200) };
gtl::set_points(poly, pts5, pts5 + 5);
contain = gtl::contains(poly, Point(197, 202)); // expect false
contain = gtl::contains(poly, Point(200, 302)); // expect true
contain = gtl::contains(poly, Point(200, 400)); // expect true
contain = gtl::contains(poly, Point(150, 200)); // expect true

在2,3条件下,gtl::contains返回false,即使Point(200, 400)是我自己指定的坐标。 所以为什么?使用 gtl::polygon_90_data 有什么限制吗?

最佳答案

我认为根据定义,任何面积为零的平面几何体都是自相交的。

几何算法通常无法很好地处理这些问题,并且可能会记录先决条件。在这一点上,我找不到这样的 Boost Polygon/GTL 文档。

根据我阅读源代码所收集到的信息,contains 的一些重载/变体接受 bool 参数 consider_touch,这可能会帮助您解决问题。但要注意未指定的行为。 (例如,多边形/多边形实现计算交点,计算具有重叠边的交点将是……有问题的)。

长话短说:

我会为非平面几何体使用线段/线,这样您就不会惊奇到任何(未记录的?)几何体不变量或算法前提条件

关于c++ - boost::polygon_90_data 无法处理面积值为 0 的多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290657/

相关文章:

c++ - 如何按升序编号输入?

C++ 标准布局和引用

c++ - 定义值类型不是 CopyConstuctible 或 Assignable 的自定义(STL 兼容)迭代器

c++ - glDrawElements 绘制多边形

c++ - 在什么情况下,现代编译器不能对函数应用 NRVO 优化?

c++ - 如何判断当前进程是否为服务(C++、Win32)?

c++ - Boost变体失败

c++ - 找到执行文件的目录?

c++ - 如何使用控制台窗口中的输入顶点在 glut 中绘制多边形?

javascript - Javascript Canvas 中的简单寻路 - 思考冒险游戏