如何使用Boost Geometry表示直线?
我不需要有限线段,但我需要无限直线(也许Segment或Linestring可以扩展?)
据我所知,我可以使用boost::geometry::intersects
,但我不知道如何定义无限直线。
如何使用Boost Geometry表示直线?
我不需要有限线段,但我需要无限直线(也许Segment或Linestring可以扩展?)
据我所知,我可以使用boost::geometry::intersects
,但我不知道如何定义无限直线。
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
为真。