我一直在尝试使用Boost几何库编写算法(如果重要的话,尝试编写一个盒子计数算法),其中一部分包括处理多边形。虽然我想计算多边形边界与大量框(网格划分)的交点,但如果您愿意,可以计算其外环。奇怪的是,函数相交(box [i],polygon)相交(box [i],exterior_ring(polygon))和within(box [i],polygon)给出了相同的结果。 对于完全位于多边形内部的框,我应该得到true,false,例如true。对于边界上的一个真,真,假。 怎么不以我认为应该的方式计算呢?
答案 0 :(得分: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,您可以获得盒子或环形交叉点。要强制后者,您需要将盒子视为一个环。在Boost.Geometry中实现此目的的标准方法是在框中应用适当的“视图”。