Exclude и исключение

В библиотеке 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).


Особенности и ограничения

  1. Замкнутые контуры Метод exclude корректно работает только с замкнутыми Path. Если путь не замкнут, Paper.js автоматически пытается замкнуть его при вычислении булевой операции.

  2. Сложные пересечения При множественных пересечениях и сложных кривых результат может содержать несколько сегментов, образующих CompoundPath. Это значит, что отдельные части могут быть отдельными под-объектами внутри одной структуры.

  3. Точность и топология Для очень тонких или почти касающихся объектов могут возникать артефакты из-за числовой точности. В таких случаях полезно использовать методы 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 — мощный инструмент для векторной графики, позволяющий управлять пересечениями форм и создавать сложные композиции без ручного расчёта сегментов. Правильное применение и последовательное использование операций открывает широкие возможности для генеративной и интерактивной графики.