Булевы операции SVG / векторных графических объектов (объединение, пересечение, вычитание) - PullRequest
11 голосов
/ 23 ноября 2010

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

То, что я нашел, включает в себя:

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

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

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010

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

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

2 голосов
/ 27 апреля 2013

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

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

...