Это вопрос о Boost Polygon (не о Boost Geometry)
Недавно я пытался поиграть с некоторыми геометрическими многоугольными конструкциями. поскольку Повысить геометрию (а разные библиотека, которая также имеет дело с полигонами) не работает косвенно в Boost 1.58, хотя я бы попробовал Увеличить полигон.
Попытавшись понять библиотеку и не получив ожидаемых результатов, я обнаружил, что библиотека работает только для целочисленных координат. Сначала я думал, что это ограничение для ввода, но на самом деле все внутренние операции и выходы являются целыми числами, это делает весь вывод довольно странным, например, пересечения для полигонов слегка деформированы (потому что координаты вершин должны быть целыми числами). ).
Цитата с главной страницы (выделено мое):
Тип данных координат является параметром шаблона всех типов данных и
алгоритмы, предоставляемые библиотекой, и как ожидается, будет неотъемлемой.
Типы данных координат с плавающей точкой не поддерживаются посредством
Алгоритмы реализованы в библиотеке в связи с тем, что (sic)
достижение устойчивости с плавающей запятой подразумевает другой набор
алгоритмы и, как правило, специфичные для платформы предположения о плавающих
точечные представления.
Сначала я подумал, что это была проблема между точным и неточным представлением, поэтому я попытался заставить его работать с рациональными (Boost Rational) типами (я определил рациональный класс-обертку, чтобы он компилировался), но на самом деле целочисленные координаты — это строгое требование (В коде есть части, которые на самом деле добавляют и вычитают одну для построения промежуточных результатов).
Возвращаясь к целым числам, мне пришлось сделать координаты очень большими (в целочисленных терминах), чтобы эта проблема дискретности исчезла. Другими словами, я должен все нормализовать взад и вперед. Ну, в конце это не очень полезно или удобно, как я первоначально думал.
Я что-то упускаю из-за использования этой библиотеки?
Эта библиотека предназначена для проблем с пикселями? Что такое полезность, если координаты ограничены целыми числами?
Является ли идея масштабировать координаты до очень больших чисел, а затем перенормировать результаты позже для геометрических приложений?
Я понимаю, что вычислительная геометрия с плавающей точкой очень больно, но почему эта библиотека даже не пытается быть совместимой с точными рациональными значениями?
Есть ли реальные примеры использования? (Руководство довольно плохо дает примеры) Кто-нибудь на самом деле использует эту библиотеку?
Бонусный вопрос: Это заброшенная библиотека?
Это пример того, как библиотека ведет себя из целочисленных координат:
Вот пример того, что происходит с целочисленными полигонами. Если я использую маленькие числа для представления координат, результаты даже не геометрически согласованы. (Два полигона polygon(-2,0)(2,-2)(6,4)(0,2)
а также polygon(-5,0)(-1,-2)(3,4)(-3,2)
)
(обратите внимание, как искажается все.)
Но когда я масштабирую полигоны так, чтобы они имели большие целочисленные координаты, результаты становятся более точными (два полигона polygon(-200,0)(200,-200)(600,400)(0,200)
а также polygon(-500,0)(-100,-200)(300,400)(-300,200)
, масштабированные версии двух выше.):
РЕДАКТИРОВАТЬ: я узнал немного больше вычислительной геометрии, очевидно, надежность вычислительной геометрии является очень сложной проблемой. Одна из стратегий — использовать целочисленную арифметику. Похоже, Boost.Polygon использует этот подход. Проблемы в непрерывном пространстве должны масштабироваться соответствующим образом.
Это не заброшено.
Да, это используется (многими) людьми.
Одна вещь, которую он делает, которая, кажется, имеет прочную базу пользователей, это, например, Диаграммы Вороного и связанные алгоритмы. Вы можете найти множество вопросов об этом и в SO, так что вы можете узнать, для чего они его используют.
Бонусный ответ
Вы даже можете объединить библиотеки с помощью
#include <boost/geometry/geometries/adapted/boost_polygon.hpp>