Boost Geometry: пересечение многоугольника и прямоугольника

Я пытался закодировать алгоритм, используя библиотеку геометрии Boost (пытаясь закодировать алгоритм подсчета блоков, если это имеет значение), и часть его состоит в обработке многоугольника. Хотя я хотел бы вычислить пересечение границы многоугольника с большим количеством блоков (сетка), его внешнее кольцо, если вы предпочитаете. Странно, что функции пересекаются (box [i], многоугольник) пересекаются (box [i], external_ring (многоугольник)) и внутри (box [i], многоугольник) дают мне тот же результат.
Для прямоугольника полностью внутри многоугольника я должен получить true, false, например, true. Для одного на границе правда, правда, ложь.
Почему это не так, как я думаю?

1

Решение

Ваш вопрос о 3 функциях:

  1. пересекает (коробка, многоугольник)
  2. пересекает (коробка, кольцо)
  3. внутри (коробка, кольцо)

Позвольте мне начать с # 3. Функция в поддерживает только box-box и box-point input. Это означает, что кольцо неявно преобразуется в ограничивающий прямоугольник, и вы получите правильные ответы (когда один прямоугольник находится внутри другого, они рассматриваются как пересекающиеся как геометрические фигуры).

Для # 2 кажется, что вы хотите получить «ложь», даже если коробка находится внутри кольца. Это означает, что вы хотите рассматривать кольцо (контур) как ломаную линию (также называемую «линейной линией»). Вы должны объяснить Boost.Geometry, чтобы рассматривать кольцо как линейную линию.

Для этого вы, вероятно, можете «обернуть» контейнер контура (или кольца) в некоторый класс, а затем зарегистрировать этот класс как линейную строку (или как многолинейную строку). Сам класс может быть очень легким, просто храня указатель на контейнер и обеспечивая надлежащий доступ к const. Вы регистрируете этот класс как строку, используя макрос BOOST_GEOMETRY_REGISTER_LINESTRING или же BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING,

После этого вы передаете его «пересекается» примерно как intersects(my_linestring_wrapper(polygon), box_view(box[i])), Вот код box_view(box[i]) вернет легкий объект, который ведет себя как «кольцо» (контур).

Для # 1 вы можете получить пересечение box-box или ring-ring. Чтобы заставить последнего, вам нужно рассматривать коробку как кольцо. Стандартный способ добиться этого в Boost.Geometry — применить правильный «вид» к блоку.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector