Булевы операции — это мощный инструмент для работы с векторными
объектами в Paper.js, позволяющий создавать сложные формы путем
объединения, пересечения и вычитания фигур. Paper.js реализует их через
методы unite(), intersect(),
subtract() и exclude(), применяемые к объектам
типа Path и CompoundPath.
let circle = new Path.Circle(new Point(80, 50), 40);
let rectangle = new Path.Rectangle(new Point(50, 30), new Size(100, 60));
let result = circle.unite(rectangle);
result.fillColor = 'blue';
Ключевой момент: unite() создаёт новый объект, исходные
фигуры остаются неизменными.
let intersection = circle.intersect(rectangle);
intersection.fillColor = 'green';
Используется для выделения общей зоны между объектами.
let subtraction = rectangle.subtract(circle);
subtraction.fillColor = 'red';
Важно: порядок фигур критичен — вычитание происходит из первого объекта относительно второго.
let exclusion = circle.exclude(rectangle);
exclusion.fillColor = 'orange';
Эта операция полезна для создания эффектов «вычленения» и отрицательных пространств.
CompoundPathБулевы операции особенно удобны при работе с объектами
CompoundPath — это сложные фигуры, состоящие из нескольких
контуров, где внутренние контуры могут задавать вырезы.
let compound = new CompoundPath({
children: [circle, rectangle],
fillColor: 'purple'
});
let cut = compound.subtract(new Path.Rectangle(new Point(60, 40), new Size(50, 50)));
В CompoundPath каждая часть фигуры сохраняет свои
координаты и ориентацию, что делает возможным более гибкое
комбинирование.
Булевы операции в Paper.js используют алгоритмы построения контуров, что может быть ресурсоёмко при работе с большим числом точек или сложными контурами. Рекомендации по оптимизации:
Path.Булевы операции корректно работают с трансформированными объектами: масштабированием, вращением и перемещением. Важно учитывать:
circle.rotate(45);
let intersected = circle.intersect(rectangle);
При создании нового объекта результат булевой операции наследует атрибуты заливки и обводки по умолчанию, но их можно настроить:
let result = circle.unite(rectangle);
result.fillColor = 'yellow';
result.strokeColor = 'black';
result.strokeWidth = 2;
Если исходные объекты имеют прозрачность, результат операции
корректно отражает перекрытия, но визуальные эффекты, такие как
blendMode, нужно задавать вручную.
console.log(path.length) для проверки
наличия вершин после операций.path.clockwise()), так как Paper.js учитывает ориентировку
при вычислении булевых операций.Булевы операции в Paper.js позволяют создавать гибкие и сложные векторные формы, сочетая простые фигуры с точным контролем пересечений и вычитаний, при этом важно учитывать производительность, направление контуров и наследование стилей для корректного визуального результата.