增强几何体:多边形和框的交集

Boost Geometry: intersection of a polygon and a box

本文关键字:几何体 多边形 增强      更新时间:2023-10-16

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

您的问题是关于 3 个函数:

  1. 相交(方形、多边形)
  2. 相交(盒子、环)
  3. 内(盒子、环)

让我从#3开始。其中的功能仅支持盒盒和盒点输入。这意味着环被隐式转换为其边界框,并且您得到的答案是正确的(当一个框在另一个框中时,它们被视为与几何形状相交)。

对于#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,您可以获得盒子或环形交叉点。要强制使用后者,您需要将盒子视为戒指。在 Boost.Geometry 中实现此目的的标准方法是对框应用适当的"视图"。