В библиотеке Paper.js важную роль играют операции над векторными
объектами, особенно булевы операции с формами. Среди них выделяется
метод exclude, позволяющий создавать вычитающие композиции
между объектами. Он является частью набора булевых операций
(unite, intersect, subtract,
exclude), которые реализованы для объектов типа
Path и CompoundPath.
excludeМетод exclude выполняет вычитание пересечения
двух объектов, оставляя области, которые не пересекаются. Если
рассматривать два перекрывающихся объекта A и B,
A.exclude(B) вернёт новый объект, состоящий из частей A и
B, которые не пересекаются, исключая общую зону.
var path1 = new Path.Rectangle(new Point(50, 50), new Size(100, 100));
path1.fillColor = 'red';
var path2 = new Path.Circle(new Point(100, 100), 50);
path2.fillColor = 'blue';
var result = path1.exclude(path2);
result.fillColor = 'green';
В этом примере красный квадрат и синий круг пересекаются. Метод
exclude создаёт новый объект зелёного цвета, представляющий
объединённые непересекающиеся части исходных фигур.
Ключевые моменты:
exclude всегда возвращает новый объект
типа Path или CompoundPath.path1 и path2 не
изменяются.Если необходимо применить exclude к более чем двум
объектам, последовательность операций имеет значение:
var a = new Path.Rectangle(new Point(20, 20), new Size(80, 80));
var b = new Path.Circle(new Point(60, 60), 40);
var c = new Path.Ellipse(new Point(100, 60), 80, 50);
var temp = a.exclude(b);
var finalResult = temp.exclude(c);
finalResult.fillColor = 'purple';
Результат зависит от порядка вызова метода:
(a.exclude(b)).exclude(c) даёт другой результат, чем
(b.exclude(c)).exclude(a).
Замкнутые контуры Метод exclude
корректно работает только с замкнутыми Path. Если путь не
замкнут, Paper.js автоматически пытается замкнуть его при вычислении
булевой операции.
Сложные пересечения При множественных
пересечениях и сложных кривых результат может содержать несколько
сегментов, образующих CompoundPath. Это значит, что
отдельные части могут быть отдельными под-объектами внутри одной
структуры.
Точность и топология Для очень тонких или почти
касающихся объектов могут возникать артефакты из-за числовой точности. В
таких случаях полезно использовать методы simplify() или
flatten() перед вызовом exclude.
path1.flatten(0.5); // Преобразует кривые в полилинии с точностью 0.5
path2.simplify(); // Убирает лишние сегменты и упрощает контур
var result = path1.exclude(path2);
Метод exclude активно используется для
динамического создания клиппинговых и вычитающих
масок:
var background = new Path.Rectangle(view.bounds);
background.fillColor = 'lightgray';
var movingCircle = new Path.Circle(new Point(0, 100), 50);
movingCircle.fillColor = 'white';
function onFrame(event) {
movingCircle.position.x += 2;
var visibleArea = background.exclude(movingCircle);
project.activeLayer.removeChildren();
visibleArea.fillColor = 'lightgray';
}
В этом примере белый круг движется по серому фону, а
exclude создаёт динамически изменяющуюся область, где круг
“вырезает” фон.
clone(), чтобы создать
копию объекта перед exclude, если исходный объект нужен для
других операций.unite, intersect, subtract) для
создания сложных форм.Метод exclude в Paper.js — мощный инструмент для
векторной графики, позволяющий управлять пересечениями форм и создавать
сложные композиции без ручного расчёта сегментов. Правильное применение
и последовательное использование операций открывает широкие возможности
для генеративной и интерактивной графики.