Геометрия линии пересечения Poly boost

Я хочу рассчитать точку пересечения линии:

l := direction * x + origin for x e R or x e [0,R+)

и полигон ускорения по умолчанию. В документации я нашел только возможность получить пересечение с отрезком линии (фиксированная начальная и конечная точки)

На данный момент я использую геометрию ускорения и для пересечения: http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/algorithms/intersection.html

Я что-нибудь пропустил? Или вы знаете какую-то функцию повышения, которую я могу использовать для решения моей проблемы.


Я попробовал обходной путь:

  typedef boost::geometry::model::d2::point_xy<double> Point;
  typedef boost::geometry::model::segment<Point> Segment;
  Segment AB( Point{1,1*std::numeric_limits<double>::lowest()},Point{0,1*std::numeric_limits<double>::max()});
  boost::geometry::model::polygon<Point> poly;
  poly.outer().push_back(Point{0,0});
  poly.outer().push_back(Point{10,0});
  poly.outer().push_back(Point{10,10});
  poly.outer().push_back(Point{0,10});
  poly.outer().push_back(Point{0,0});
  std::vector<Segment> result;
  boost::geometry::intersection(AB,poly,result);

Я использую boost 1.56 и получаю сообщение об ошибке, что это еще не реализовано. Вы знаете, где я могу найти список, какие пересечения реализованы? Или у вас есть какая-то новая идея?


person Hunk    schedule 12.01.2015    source источник
comment
Вы собираетесь быть чертовски более конкретным. Не существует такого понятия, как полигон ускорения по умолчанию. Вы имеете в виду boost.org/doc/libs/ 1_51_0 / libs / polygon / doc / или, как предполагает тег, boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/?   -  person sehe    schedule 12.01.2015
comment
извините, забыл сказать вам, какую библиотеку я использую   -  person Hunk    schedule 12.01.2015


Ответы (1)


Boost.Geometry не имеет бесконечной концепции Line или Ray. Так что для этого действительно нужно использовать сегмент или строку. Использование сегмента действительно выглядит лучшим способом, но теперь его может не поддерживать crossction (). Вы можете создать заявку с запросом функции, если она вам очень нужна. На данный момент вы можете использовать Linestring вместо сегмента для определения линии. Чтобы сохранить результат, вы можете использовать MultiLinestring или вектор точек. Во втором случае вы получите точки пересечения, так что AFAIU именно то, что вам нужно:

typedef boost::geometry::model::d2::point_xy<double> Point;
typedef boost::geometry::model::linestring<Point> Linestring;
typedef boost::geometry::model::polygon<Point> Polygon;

Linestring ls;
Polygon poly;
std::vector<Point> result;
boost::geometry::intersection(ls,poly,result);

Если вышеперечисленное не компилировалось, вам следует использовать более новую версию Boost.

Вероятно, вам не следует создавать Linestring, содержащую двойное наименьшее / максимальное значение. Это потому, что вы получите массовые числовые ошибки. Чем ближе точки сегмента, тем лучше. Например, вы можете вручную вычислить точки сегмента, являющегося пересечением линии и ограничивающей рамки Polgon или ограничивающей сферы и т. Д.

person Adam Wulkiewicz    schedule 28.04.2015