2

我的多边形有整数坐标,可能像一条线,我发现 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 是否有一些限制?

4

1 回答 1

2

我认为任何面积为零的平面几何都是自相交的。

几何算法通常不能很好地处理这些问题,并且可能会记录先决条件。此时我无法使用 Boost Polygon/GTL 找到此类文档。

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

TL;博士:

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

于 2018-01-16T23:22:21.687 回答