В чем полезность Boost Polygon?

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

smallints

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

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

largeints


РЕДАКТИРОВАТЬ: я узнал немного больше вычислительной геометрии, очевидно, надежность вычислительной геометрии является очень сложной проблемой. Одна из стратегий — использовать целочисленную арифметику. Похоже, Boost.Polygon использует этот подход. Проблемы в непрерывном пространстве должны масштабироваться соответствующим образом.

10

Решение

Это не заброшено.

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

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

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

Вы даже можете объединить библиотеки с помощью

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

Другие решения


По вопросам рекламы [email protected]