2016-05-09 11 views
0

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

ответ

1

Вы не можете, потому что концепции, определенные в 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, 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); метод: t; операции: x/u; сегменты ID: {0, -1, -1, 0}/{0, -1, -1, 7} '

+0

я вдруг понимаю, что предполагается [тег: повышение геометрией]. Я не знаком с [tag: boost-polygon], поэтому, если это контекст, мой ответ может быть неточным. – sehe

+0

Эй, спасибо за ответ. Я точно знаю, что вы можете найти самопересечения в polygon.as, я видел код, который это делает. Я просто не помню, как это сделать. Я думаю, что было использование turn_info. но я теряюсь там. если вы знаете, как использовать get turn_info, возможно, это может помочь. –

+0

Я действительно заметил сообщение в списке рассылки Boost Geometry, где ... по иронии судьбы Адам Улькевич говорит: «Я видел в другом электронном письме, что вы уже разобрались». Я действительно думаю, что пришло время для вас добавить некоторые ссылки на это, даже самопознание - это действительно правильное Q & A. Как бы то ни было, вы сознательно рискуете, что люди прячут колеса, тратя время на вас, когда вы уже разобрались. – sehe

1

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

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