使用Boost几何的线交叉

时间:2015-12-07 12:05:08

标签: c++ boost line boost-geometry line-intersection

如何使用Boost Geometry表示线?

我不需要有限段,但我需要无限行(可能SegmentLinestring可以扩展吗?)

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

1 个答案:

答案 0 :(得分: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类型只是表示使用属于该行一部分的段的行,但是作为一个单独的类型,因此可以通过类型系统将其与段区分开来,以便进行重载。

它首先查询A first的两个端点(secondB)的哪一侧。然后,如果firstSidesecondSide中的任何一个为零,则表示相应的端点正在触及A,因此intersects为真。否则,如果端点位于intersects的相对侧,则A为真。