Есть ли в boost функция для нахождения объединения между сегментами? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть коллекция сегментов на Манхэттенской сетке.Некоторые из них перекрываются.Есть ли в boost функция, которая возвращает коллекцию сегментов, представляющих объединение этих сегментов?

В своих поисках я обнаружил функцию объединения, но она не реализована для model::segment.Я также просмотрел библиотеку boost::polygon::segment, но у них есть только метод пересечения.

Изображение сегментов

Этот фрагмент кода представляет собой заданное изображениечто источник находится ниже A, на высоте C.Вот как будет выглядеть код.

    namespace gtl = boost::polygon;
    using namespace boost::polygon::operators;
    // A->P
    gtl::segment_data<double> Segment1(gtl::point_data<double>(0, 0), gtl::point_data<double>(0, 5));
    gtl::segment_data<double> Segment2(gtl::point_data<double>(0, 0), gtl::point_data<double>(5, 0));
    // C->P
    gtl::segment_data<double> Segment3(gtl::point_data<double>(12, 0), gtl::point_data<double>(5, 0));
    // B->P
    gtl::segment_data<double> Segment4(gtl::point_data<double>(7, -5), gtl::point_data<double>(7, 0));
    gtl::segment_data<double> Segment5(gtl::point_data<double>(7, 0), gtl::point_data<double>(5, 0));
    std::vector<gtl::segment_data<double>> Segments{Segment1, Segment2, Segment3, Segment4, Segment5};

    std::vector<gtl::segment_data<double>> output;
    gtl::UNION_FUNCTION(output, Segments.begin(), Segments.end());

На этом изображении есть сегменты от:

A до P (2 сегмента)
B доP (2 сегмента)
C до P (1 сегмент)

Есть пересечение, отмеченное красным.

Желаемый результат будет:

A to P (2 segments)
B to P (only the vertical segment)
C to P (1 segment)

Другим правильным решением может быть горизонтальный сегмент, идущий от C до A координат *1034*, и 2 других вертикальных сегмента, соединяющих B и A с горизонтальным.

Если окажется, что такой функции нет, как бы я решил эту проблему?Я видел несколько других потоков, таких как этот Find-Union-Length-of-Many-Line-сегментов , но они не упоминают boost, поэтому другой вопрос будет, как это сделать, используяboost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...