使用Boost Geometry进行线段相交判断

3

如何使用Boost Geometry表示直线?

我不需要有限线段,但我需要无限直线(也许SegmentLinestring可以扩展?)

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


2
Boost.Geometry 没有无限线或射线的概念。 - Vertexwahn
@Vertexwahn Boost 中没有进行线线相交的方法吗? - mrgloom
目前为止,不适用于无限行... - Vertexwahn
线段交点可以通过一个端点非常远离另一个端点的线段来近似表示。 - Lofty Lion
1个回答

0
如果你想测试一个无限直线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为真。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接