Boost Geometry:多边形和盒子的交集

Posted

技术标签:

【中文标题】Boost Geometry:多边形和盒子的交集【英文标题】:Boost Geometry: intersection of a polygon and a box 【发布时间】:2013-11-10 12:04:24 【问题描述】:

我一直在尝试使用 Boost 几何库编写算法(如果需要,尝试编写盒子计数算法),其中一部分涉及处理多边形。虽然我想计算多边形边界与大量框(网格)的交点,但如果您愿意,它的外环也是如此。奇怪的是,函数 intersects(box[i], polygon) intersects(box[i], exterior_ring(polygon)) 和 inside(box[i],polygon) 给了我相同的结果。 例如,对于一个完全在多边形内的盒子,我应该得到真、假、真。对于边界上的一个真,真,假。 为什么它没有按照我认为的方式计算它?

【问题讨论】:

【参考方案1】:

您的问题是关于 3 个功能:

    相交(框、多边形) 相交(框、环) 在(框、环)内

让我从#3 开始。 within函数只支持box-box和box-point输入。这意味着环被隐式转换为其边界框,并且您得到的答案是正确的(当一个框在另一个框内时,它们被视为几何形状相交)。

对于#2,即使盒子在环内,您似乎也想得到“假”。这意味着您想将环(轮廓)视为折线(又名“线串”)。您应该向 Boost.Geometry 解释将环视为线串。

为此,您可以将轮廓(或环形)点容器“包装”到某个类中,然后将该类注册为线串(或多线串)。该类本身可以非常轻量级,只需保留指向容器的指针并提供适当的 const 访问。您可以使用宏BOOST_GEOMETRY_REGISTER_LINESTRINGBOOST_GEOMETRY_REGISTER_MULTI_LINESTRING 将此类注册为线串。

之后,您将其传递给“相交”,大致为intersects(my_linestring_wrapper(polygon), box_view(box[i]))。这里的代码box_view(box[i]) 将返回一个轻量级对象,其行为类似于“环”(轮廓)。

对于#1,您可以获得 box-box 或 ring-ring 交叉点。要强制后者,您需要将框视为环。在 Boost.Geometry 中实现这一点的标准方法是对盒子应用适当的“视图”。

【讨论】:

感谢您的贡献,我更清楚地看到了它,在我的情况下,您的第二点是我正在尝试实施的,尽管我在使用您的 identity_view 时遇到了麻烦,我添加了标题#include 并使用 if(boost::geometry::intersects(my_box,boost::geometry::identity_view(boost::gemetry::exterior_ring(my_polygon))) 给我以下编译错误:错误: 在 '(' 标记之前缺少模板参数难道是我需要在使用 identity_view 之前添加模板定义吗?!在 boost geometry 网站上似乎没有关于此函数的任何文档。 谢谢,我修改了答案以摆脱 identity_view 并提出了另一种解决方案。 感谢 Michael 的新建议,虽然我现在实现了其他东西,但我正在使用 boost::geometry::within 函数并检查每个框的两个点:within(my_box.min_corner,my_polygon ) 在(my_box.max_corner,my_polygon) 内进行异或,因为在大多数情况下,要使框与边界相交而不被包括在内,我们需要一个角进一个角出(我的近似值)。这要快得多,而且现在似乎工作得很好。感谢您的帮助。 以防万一,您的新解决方案是创建一个从 Linestring 派生的类,并添加一个构造函数,将多边形作为参数,在多边形的外环上构建线串?

以上是关于Boost Geometry:多边形和盒子的交集的主要内容,如果未能解决你的问题,请参考以下文章

boost多边形交集并集

使用具有线段属性的Boost :: Geometry Polygon布尔值/交叉点

查询与 boost::geometry::index::rtree 的交集

奇怪的行为将 boost::geometry::within() 用于多边形和环

用 boost::geometry 扩展多边形?

提升几何相交会产生奇怪的结果