提升几何:多边形和方框的交集

时间:2013-11-10 12:04:25

标签: c++ boost boost-geometry

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

1 个答案:

答案 0 :(得分:1)

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

  1. 相交(方框,多边形)
  2. 相交(盒子,戒指)
  3. 内(盒子,戒指)
  4. 让我从#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,您可以获得盒子或环形交叉点。要强制后者,您需要将盒子视为一个环。在Boost.Geometry中实现此目的的标准方法是在框中应用适当的“视图”。