boost::polygon_90_data 无法处理面积值为 0 的多边形?
boost::polygon_90_data can not handle polygons with 0 area value?
我的多边形有整数坐标,可能像一条线,我发现 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 return false,即使通过Point(200, 400)是自己指定的坐标。
所以为什么?使用 gtl::polygon_90_data 有什么限制吗?
我认为根据定义,任何面积为零的平面几何都是自相交的。
几何算法通常无法很好地处理这些问题,并且可能会记录先决条件。在这一点上,我找不到这样的 Boost Polygon/GTL.
文档
根据我阅读源代码所收集到的信息,contains
中的一些 overloads/variations 接受布尔参数 consider_touch
,这可能对您有所帮助。但要注意未指定的行为。 (例如,polygon/polygon 实现计算交叉点,并且计算具有重叠边缘的交叉点将是......有问题的)。
长话短说:
对于非平面几何,我会使用 segment/line,这样您就不会对任何(未记录的?)几何不变量或算法先决条件感到吃惊
我的多边形有整数坐标,可能像一条线,我发现 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 return false,即使通过Point(200, 400)是自己指定的坐标。 所以为什么?使用 gtl::polygon_90_data 有什么限制吗?
我认为根据定义,任何面积为零的平面几何都是自相交的。
几何算法通常无法很好地处理这些问题,并且可能会记录先决条件。在这一点上,我找不到这样的 Boost Polygon/GTL.
文档根据我阅读源代码所收集到的信息,contains
中的一些 overloads/variations 接受布尔参数 consider_touch
,这可能对您有所帮助。但要注意未指定的行为。 (例如,polygon/polygon 实现计算交叉点,并且计算具有重叠边缘的交叉点将是......有问题的)。
长话短说:
对于非平面几何,我会使用 segment/line,这样您就不会对任何(未记录的?)几何不变量或算法先决条件感到吃惊