使用 Boost Geometry 的线相交

Posted

技术标签:

【中文标题】使用 Boost Geometry 的线相交【英文标题】:Lines intersection using Boost Geometry 【发布时间】:2015-12-07 12:05:07 【问题描述】:

如何使用 Boost Geometry 来表示线?

我不需要有限段,但我需要无限行(也许Segment 或Linestring 可以扩展?)

据我所知,我可以使用boost::geometry::intersects,但我不知道如何定义无限线。

【问题讨论】:

Boost.Geometry 没有无限的线或射线概念。 @Vertexwahn 没有办法在 Boost 中进行线-线交叉? 目前还没有无限线...... 线交点可以用一个端点相距很远的线段来近似。 【参考方案1】:

如果要测试无限线A是否与线段B相交,可以使用boost::geometry::strategy::side::side_by_triangle来完成:

template <typename Point>
struct line

    boost::geometry::model::segment<Point> segment;
;

template <typename Point>
bool intersects(line<Point> const& A, boost::geometry::model::segment<Point> const& B)

    using side = boost::geometry::strategy::side::side_by_triangle<>;
    auto const firstSide  = side::apply(A.segment.first, A.segment.second, B.first);
    auto const secondSide = side::apply(A.segment.first, A.segment.second, B.second);
    return firstSide == 0 || secondSide == 0 || (firstSide < 0) != (secondSide < 0);

line 类型仅表示使用作为该行一部分的段的行,但作为单独的类型,因此可以通过类型系统将其与段区分开来,以实现重载。

首先查询B的两个端点(firstsecond)位于A的哪一侧。然后,如果firstSidesecondSide 中的任何一个为零,这意味着相应的端点正在接触A,因此intersects 为真。否则,如果端点在 A 的相对两侧,intersects 为真。

【讨论】:

以上是关于使用 Boost Geometry 的线相交的主要内容,如果未能解决你的问题,请参考以下文章

从相交的线串计算有界多边形

boost::geometry 中无效几何的数据集

boost::geometry::Polygon 和“有向”折线的交集

Boost::geometry::intersection 与 C++

使用 boost 将几何体切割成碎片

提升几何相交会产生奇怪的结果