Я пытаюсь закодировать алгоритм с использованием библиотеки геометрии Boost (пытаясь закодировать алгоритм подсчета полей, если это имеет значение), а часть его состоит в обработке многоугольника. Хотя я бы хотел вычислить пересечение границы многоугольника с большим количеством ящиков (сетка), его внешнее кольцо, если вы предпочитаете. Странно, что функции пересекаются (поле [i], polygon) пересекается (box [i], external_ring (polygon)) и внутри (box [i], polygon) дает мне тот же результат. Для ящика, полностью внутри полигона, я должен получить true, false, true, например. Для одного на границе true, true, false. Почему он не вычисляет это так, как мне кажется?Boost Geometry: пересечение многоугольника и прямоугольника
ответ
Ваш вопрос о 3 функции:
- пересекается (коробка, многоугольник)
- пересекается (коробка, кольцо)
- внутри (коробка, кольцо)
Позвольте мне начать от # 3. Функция within поддерживает только коробку и ввод в коробку. Это означает, что кольцо неявно преобразовано в его ограничивающий прямоугольник, и ответы, которые вы получаете, верны (когда один ящик находится внутри другого, они рассматриваются как пересекающиеся как геометрические фигуры).
Для # 2 кажется, что вы хотите получить «ложный», даже если поле находится внутри кольца. Это означает, что вы хотите рассматривать кольцо (контур) как полилинию (иначе говоря, «linestring»). Вы должны объяснить Boost.Geometry считать кольцо как linestring.
Для этого вы можете, вероятно, «обернуть» контур точки (или кольца) в некоторый класс, а затем зарегистрировать этот класс как linestring (или как многострочный). Сам класс может быть очень легким, просто удерживая указатель на контейнер и обеспечивая надлежащий доступ к const. Вы регистрируете этот класс как linestring, используя макрос BOOST_GEOMETRY_REGISTER_LINESTRING
или BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING
.
После этого вы передаете его на «пересекает» примерно как intersects(my_linestring_wrapper(polygon), box_view(box[i]))
. Здесь код box_view(box[i])
вернет легкий объект, который ведет себя как «кольцо» (контур).
Для # 1 вы можете получить коробку или кольцевое пересечение. Чтобы заставить последнего, вам нужно рассмотреть коробку как кольцо. Стандартный способ достижения этой цели в Boost.Geometry - применить правильное «представление» к коробке.
- 1. Устранение многоугольника boost :: geometry
- 2. Пересечение boost :: geometry :: model :: linestring with boost :: geometry :: model :: polygon
- 3. Повторное использование boost :: geometry :: пересечение в петле
- 4. Пересечение линий с использованием Boost Geometry
- 5. Пересечение многоугольника с Boost :: ухудшение характеристик геометрии
- 6. Пересечение JMonkeyEngine-Geometry NullPointerException
- 7. boost :: geometry :: read_wkt альтернатива?
- 8. Boost, geometry
- 9. Пересечение отрезка и выпуклого многоугольника
- 10. Boost Пересечение не работает
- 11. DocumentDb: Пересечение многоугольника?
- 12. CMake Boost 1.59.0 geometry
- 13. Boost Geometry: Templating BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES
- 14. Компиляция boost :: geometry polygon
- 15. Пересечение прямоугольника java
- 16. Найти точку внутри Boost :: Geometry :: Polygon
- 17. Пересечение выпуклого многоугольника и движущегося круга
- 18. Neo4j Spatial - Найти пересечение многоугольника и строки
- 19. Найти пересечение многоугольника и упорядочить по строке
- 20. 3D-треугольник-треугольник Пересечение многоугольника
- 21. Использование многоугольника для VoronoiDiagramBuilder.setClipEnvelope вместо прямоугольника
- 22. Boost :: geometry :: производительность пересечения в режиме отладки
- 23. Настраиваемые маркеры внутри прямоугольника, круга и многоугольника
- 24. flipping polygon with boost: geometry
- 25. boost :: geometry :: union_ производит самопересечения
- 26. boost :: polygon и boost/geometry/geometries/polygon difference?
- 27. Пересечение прямоугольника и круга (или дуги)
- 28. Пересечение луча и квадрата/прямоугольника в 3D
- 29. Пересечение луча и прямоугольника в C++
- 30. Пересечение прямоугольника без осевой линии
Благодарим за вклад, который я вижу более четко, в моем случае ваш второй пункт - это тот, который я пытаюсь реализовать, хотя у меня возникли проблемы с использованием вашего удостоверения личности, я добавил заголовок #include –
Liam
И использование if (boost :: geometry :: intersects (my_box, boost :: geometry :: identity_view (boost :: gemetry :: external_ring (my_polygon))) дает мне следующая ошибка компиляции: error: missing template arguments before '(' token Может быть, мне нужно добавить определение шаблона, прежде чем использовать identity_view?! Кажется, нет никакой документации по этой функции в boost геометрия. – Liam
Спасибо, я изменил ответ, чтобы избавиться от identity_view и предложил другое решение. –