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

150
10

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


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


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

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

спросил(а) 2021-01-19T20:20:41+03:00 9 месяцев назад
1
Решение
111

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

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


ответил(а) 2021-01-19T20:20:41+03:00 9 месяцев назад
79

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

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

ответил(а) 2021-01-19T20:20:41+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема