В чем польза Boost Polygon?

Это вопрос о 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))

smallints

(обратите внимание, как все искажается).

Но когда я масштабирую многоугольники с большими целыми координатами, результаты становятся точнее (два полигона polygon(-200,0)(200,-200)(600,400)(0,200) и polygon(-500,0)(-100,-200)(300,400)(-300,200), масштабированные версии двух выше):

largeints


EDIT: я узнал немного больше вычислительной геометрии, очевидно, что надежность вычислительной геометрии - очень сложная проблема. Одна из стратегий - использовать целочисленную арифметику. Похоже, Boost.Polygon использует такой подход. Проблемы в непрерывном пространстве следует масштабировать соответствующим образом.

Ответ 1

Он не заброшен.

Да, он используется многими (людьми).

Одна вещь, которую он делает, кажется, имеет прочную базу пользователей, например. Диаграммы Вороного и связанные с ними алгоритмы. Вы можете найти большое количество вопросов об этом на SO тоже, чтобы вы могли перейти к тому, для чего они используют.

Бонусный ответ

Вы даже можете комбинировать библиотеки, используя

#include <boost/geometry/geometries/adapted/boost_polygon.hpp>