2

我有一个小测试应用程序可以将几个矩形与 boost::geometry 相交。

typedef boost::geometry::model::point
<
double, 2, boost::geometry::cs::cartesian
> point;

typedef boost::geometry::model::polygon<point > polygon;

polygon Intersect(polygon p1, polygon p2) {
    std::vector < polygon > result;
    boost::geometry::intersection(p1, p2, result);
    return result.front();
}

polygon IntersectionTest() {
    polygon one, two, three, four;

    boost::geometry::read_wkt("POLYGON((35 25, 35 35, 15 35, 15 25, 35 25))", one);
    boost::geometry::read_wkt("POLYGON((45 30, 45 50, 25 50, 25 30, 45 30))", two);
    boost::geometry::read_wkt("POLYGON((50  0, 50 40, 10 40, 10  0, 50  0))", three);
    boost::geometry::read_wkt("POLYGON((40 20, 40 60,  0 60,  0 20, 40 20))", four);

    return Intersect(Intersect(Intersect(one, two), three), four);
}

我必须做错事,因为我希望结果是这样的,(35 30, 35 40, 25 40, 25 30, 35 30)但我得到了 10 点长的多边形,其中包含点,50 0而平行矩形的交点应该始终是具有 4+1 点的矩形并且50 0位于边缘,所以它不应该是在十字路口。如果我将它放入SVG中,矩形似乎与我期望的一样。

有什么问题?如果这是一个错误,我该boost::geometry如何确保它是?(我目前使用的是 1.48。)如果它是一个错误,有没有办法绕过这个问题?

4

2 回答 2

3

多边形类具有以下模板参数:

template
<
    typename Point,
    bool ClockWise = true,
    bool Closed = true,
    template<typename, typename> class PointList = std::vector,
    template<typename, typename> class RingList = std::vector,
    template<typename> class PointAlloc = std::allocator,
    template<typename> class RingAlloc = std::allocator
>
class polygon {...}

如您所见,第二个模板参数默认为 true。这意味着定义多边形的点被认为是/应该按顺时针顺序排列。

这实际上是你的问题。

如果您查看几何的 WKT 形式,您会按逆时针顺序写点。

所以你应该:

typedef boost::geometry::model::polygon<point,false> polygon;

或者按顺时针顺序写出 WKT 字符串中的点。IE:

boost::geometry::read_wkt("POLYGON((35 25, 15 25, 15 35, 35 35, 35 25))", one);
boost::geometry::read_wkt("POLYGON((45 30, 25 30, 25 50, 45 50, 45 30))", two);

有了这个,结果将如你所料。

作为个人评论,如果 read_wkt 能够强制执行正确的阅读方向,这可能是一件好事……

于 2011-11-28T10:35:48.987 回答
2

我同意ds27680的回答。

第三种选择是在 read_wkt 之后调用 boost::geometry::correct(a geometry),如果不确定方向,鼓励用户这样做。

read_wkt 确实没有强制执行正确的方向。原因是正确的函数需要面积计算,如果用户知道多边形的顺序正确(通常已知的),则可以保存。

于 2012-01-19T17:19:07.080 回答