SVG/векторные графические объекты булевых операций (объединение, пересечение, вычитание)

У меня есть 2D замкнутые векторные пути, указанные в SVG-подобный синтаксис - т.е. эти пути включают прямые и различные кривые Безье. Есть ли что-то вроде небольшой, красивой и дискретной библиотеки (желательно на C, Java или Ruby, но любой язык будет работать, если эта библиотека чиста и проста в использовании), что позволяет выполнять логические операции, такие как объединение, пересечение и вычитание с помощью этих путей

То, что я нашел до сих пор, включает в себя:

  • Огромные и дорогие коммерческие векторные графические продукты (такие как Autodesk AutoCAD или Adobe Illustrator), которые могут быть вызваны с использованием какого-то API или с помощью сценариев для выполнения операций с логическими двумерными путями - что явно является излишним для моих целей.
  • Inkscape разработала собственную библиотеку lib2geom, в которой отсутствует документация, привязки, есть некоторые проблемы с компиляцией, которые, как представляется, используются не в проектах, кроме Inkscape и выглядит довольно сложно.
  • CGAL - огромная и довольно сложная библиотека вычислительной геометрии, которая работает в довольно странном пространстве объектов (т.е. у вас сумасшедшее сочетание шаблонов, императивные функции стиля для выполнения операций над этими шаблонами структур данных и т.д. и т.д.) и, похоже, не имеют правильных привязок к другим языкам рядом с С++. Связывание Python с CGAL кажется заброшенным и не выглядит очень дружелюбным ко мне.
  • JTS, похоже, ориентирован на ГИС и имеет дело только с прямыми линиями, в то время как мне нужно иметь дело с SVG-подобными кривыми Безье.

Итак, вопрос в том, есть ли какие-нибудь другие маленькие, красивые и легкие библиотеки, плавающие вокруг, чтобы иметь дело с булевыми операциями на SVG-подобных путях?

Ответ 1

Возможно, мне что-то не хватает, но не будут ли классы в пакете java.awt.geom соответствовать вашим потребностям? Они имеют дело с двумерными формами; класс Area имеет дело с булевыми операциями:

Объект Area хранит и управляет независимым от разрешения описанием закрытой области двумерного пространства. Объекты Area могут быть преобразованы и могут выполнять различные Операции с конструктивной зоной (CAG) в сочетании с другими объектами Area. Операции CAG включают сложение, вычитание области, пересечение и исключение или.

Ответ 2

Вы можете JavaScript Clipper, порт Angus Johnson Clipper (написанный на Delphi, С++, С# и Python), который, в свою очередь, основан на алгоритме отсечения Bala R. Vatti. Он способен обрабатывать все случаи полигона, включая самопересекающиеся.

Имейте в виду, что lib принимает только многоугольники, поэтому любые кривые должны быть полигонизированы сначала