Это вопрос о Boost Polygon (не о геометрии Boost)
Недавно я пытался играть с некоторыми геометрическими многоугольными конструкциями. Поскольку Boost Geometry (другая библиотека, которая также имеет дело с полигонами), не работает в Boost 1.58, хотя я бы попытался Boost Polygon.
Попытавшись понять библиотеку и не получив ожидаемых результатов, я обнаружил, что библиотека работает только для целых координат. Сначала, хотя это было ограничение для ввода, но на самом деле все внутренние операции и выходы являются целыми числами, что делает весь вывод довольно причудливым, например, пересечения для многоугольников слегка деформированы (поскольку координаты вершин должны быть целыми).
Цитата с главной страницы (выделение мое):
Тип данных координат является параметром шаблона для всех типов данных и алгоритмы, предоставляемые библиотекой, и , как ожидается, будет целым. Типы данных координат с плавающей запятой не поддерживаются. алгоритмы, реализованные в библиотеке из-за того, что (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)
, масштабированные версии двух выше):
EDIT: я узнал немного больше вычислительной геометрии, очевидно, что надежность вычислительной геометрии - очень сложная проблема. Одна из стратегий - использовать целочисленную арифметику. Похоже, Boost.Polygon использует такой подход. Проблемы в непрерывном пространстве следует масштабировать соответствующим образом.