У меня есть коллекция сегментов на Манхэттенской сетке.Некоторые из них перекрываются.Есть ли в 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
.