Как найти самопересечение в многоугольнике с помощью Boost/?

Мне нужно найти пересечения себя в многоугольнике. я знаю, что повышение имеет эту способность. но я не могу понять, как использовать turn_info для получения информации о пересечениях. например, какие отрезки пересекаются и т. д. кто-нибудь может помочь? Спасибо

2 ответа

Так что это код для получения самопересечений.

namespace bg = boost::geometry;
  using namespace std;
  typedef bg::model::d2::point_xy<double> point_2d;
  typedef bg::model::polygon<boost::geometry::model::d2::point_xy<double> > Polygon;

  Polygon poly { { { 10, 10 }, { 20, 10 }, { 20, 5 }, { 25, 5 }, { 25, 7 }, { 30, 7 }, { 30, 3 }, { 25, 3 }, { 25, 5 }, { 20, 5 }, { 20, 0 }, { 10, 0 }, { 10, 10 } }};


  typedef bg::point_type<Polygon>::type point_type;
  typedef boost::geometry::detail::overlay::turn_info<point_type, boost::geometry::segment_ratio<double> > TurnInfoType;

  bg::detail::no_rescale_policy robust_policy;
  bg::detail::self_get_turn_points::no_interrupt_policy interrupt_policy;
  std::vector<TurnInfoType> turns;

 boost::geometry::self_turns<boost::geometry::detail::overlay::assign_null_policy>(poly.outer(), robust_policy, turns, interrupt_policy);

для получения информации просто используйте что-то вроде:

turns[i].operations[0].seg_id.segment_index

Вы не можете должным образом, потому что концепции, определенные в Boost Geometry, не допускают самопересечения.

Тем не менее, косвенно вы можете использовать функции проверки (новые, так как я думаю 1.59), чтобы получить некоторую информацию о самопересечении:

std::string reason;
poly p;
bg::read_wkt("POLYGON((0 0, 0 4, 2 4, 2 2, 6 2, 6 6, 2 6, 2 4, 0 4, 0 8, 8 8, 8 0, 0 0))", expected);
bool ok = bg::is_valid(p, reason);
std::cout << "Expected: " << bg::dsv(p) << (ok?" valid":" invalid: '" + reason + "'") << "\n";

Печать:

Ожидаемые: (((0, 0), (0, 4), (2, 4), (2, 2), (6, 2), (6, 6), (2, 6), (2, 4), (0, 4), (0, 8), (8, 8), (8, 0), (0, 0))) недействительно: "Геометрия имеет недопустимые самопересечения. Точка самопересечения была найдена в (0, 4); метод: т; операции: х / у; идентификаторы сегмента {источник, мульти, кольцо, сегмент}: {0, -1, -1, 0}/{0, -1, -1, 7}'

Другие вопросы по тегам