Если вы хотите проверить, пересекает ли бесконечная линия 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
и second
) B
ложь. Затем, если любой из firstSide
или secondSide
равен нулю, это означает, что соответствующая оконечная точка касается A
, поэтому значение intersects
. В противном случае intersects
истинно, если конечные точки находятся на противоположных сторонах от A
.
Boost.Geometry не имеет интуитивной концепции Line или Ray. – Vertexwahn
@Vertexwahn нет способа сделать пересечение линии в Boost? – mrgloom
Не для бесконечных линий до сих пор ... – Vertexwahn