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_LINESTRING
或BOOST_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以上是关于Boost Geometry:多边形和盒子的交集的主要内容,如果未能解决你的问题,请参考以下文章
使用具有线段属性的Boost :: Geometry Polygon布尔值/交叉点
查询与 boost::geometry::index::rtree 的交集