使用 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
的两个端点(first
和second
)位于A
的哪一侧。然后,如果firstSide
或secondSide
中的任何一个为零,这意味着相应的端点正在接触A
,因此intersects
为真。否则,如果端点在 A
的相对两侧,intersects
为真。
【讨论】:
以上是关于使用 Boost Geometry 的线相交的主要内容,如果未能解决你的问题,请参考以下文章
boost::geometry::Polygon 和“有向”折线的交集