我一直在尝试使用 Boost 几何库编写算法(如果重要的话,尝试编写盒子计数算法),其中一部分是处理多边形。虽然我想计算多边形边界与大量框(网格)的交集,但如果您愿意,它的外环也是如此。奇怪的是,函数 intersects(box[i], polygon) intersects(box[i], exterior_ring(polygon)) 和 inside(box[i],polygon) 给了我相同的结果。例如,对于一个完全在多边形内的盒子,我应该得到真、假、真。对于边界上的一个真,真,假。为什么它不像我认为的那样计算它?
1 回答
您的问题是关于 3 个功能:
- 相交(框,多边形)
- 相交(框,环)
- 内(盒子,戒指)
让我从#3开始。里面的函数只支持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 中实现这一点的标准方法是对盒子应用适当的“视图”。