2013-11-10 3 views
1

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

ответ

1

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

  1. пересекается (коробка, многоугольник)
  2. пересекается (коробка, кольцо)
  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 - применить правильное «представление» к коробке.

+0

Благодарим за вклад, который я вижу более четко, в моем случае ваш второй пункт - это тот, который я пытаюсь реализовать, хотя у меня возникли проблемы с использованием вашего удостоверения личности, я добавил заголовок #include Liam

+0

И использование 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

+1

Спасибо, я изменил ответ, чтобы избавиться от identity_view и предложил другое решение. –

Смежные вопросы