Boost几何:使用开区间的交叉点

Posted

技术标签:

【中文标题】Boost几何:使用开区间的交叉点【英文标题】:Boost geometry : intersection using an open interval 【发布时间】:2018-11-21 19:56:02 【问题描述】:

我有一条折线和一条线段。线段的端点之一总是折线的一个点。

示例: 线段:(1,2),(3,3) 折线:(3,3),(10,10),(15,30)

我想使用boost几何来查找线段和折线是否有交点。但是,它们可以在连接点相交。在这种情况下,(3,3)。

boost::geometry::intersects 在这种情况下将始终返回 true。我想为公共点做一个例外,但如果在任何其他点有交叉点,它仍然返回true。有没有聪明的方法来解决这个问题?还是我必须使用boost::geometry::intersection 并迭代结果?

【问题讨论】:

【参考方案1】:

如果我理解正确,您想检查线段是否与折线相交,而不是其连接点。

因此,您只需要检查没有与红色段共享端点的段(见图)。您可以跳过那些与红色段具有相同端点的那些,或者您可能希望以不同的方式处理它们,例如,检查整个段是否重合。

很久没接触c++所以写了伪代码:

foreach (segment in polyline) 
    if (
        segment.A != redSegment.A &&
        segment.A != redSegment.B &&
        segment.B != redSegment.A &&
        segment.B != redSegment.B &&
        intersect (segment, redSegment)
    ) 
        return true;
    

return false;

【讨论】:

不幸的是,此解决方案将错过公共点的相邻折线段上的任何交点。 @user129186,我以为你想避免检测公共点的交叉点。但也许您想检查相邻线段是否与红色线段部分重合?

以上是关于Boost几何:使用开区间的交叉点的主要内容,如果未能解决你的问题,请参考以下文章

最长k可重区间集(cogs 743)

网络流 P3358 最长k可重区间集问题

网络流24题21最长k可重区间集问题

最长k可重区间集

「网络流24题」「LuoguP3358」 最长k可重区间集问题

random模块