CompoundPath — это объект Paper.js, позволяющий
объединять несколько контуров (Path) в один логический
элемент. Основное преимущество использования CompoundPath —
возможность работать с набором путей как с единой фигурой, применять
заливки, трансформации и выполнять булевы операции, сохраняя структуру
сложной фигуры.
Создание CompoundPath выполняется через конструктор:
var path1 = new Path.Circle({
center: [50, 50],
radius: 40,
fillColor: 'red'
});
var path2 = new Path.Rectangle({
point: [30, 30],
size: [60, 60],
fillColor: 'blue'
});
var compound = new CompoundPath({
children: [path1, path2],
fillColor: 'green'
});
Важные моменты:
children содержит массив объектов
Path.fillColor) задается для всей
композиции.CompoundPath могут быть
вычтены или добавлены с помощью
булевых операций.Методы CompoundPath позволяют управлять отдельными
контурами:
compound.addChild(new Path.Ellipse({
point: [100, 100],
size: [80, 40]
}));
compound.removeChildren(0, 1); // Удаляет первые два пути
CompoundPath хранит порядок контуров, что критично для
операций типа вычитание внутреннего контура из внешнего
(например, создание дырки).
Paper.js поддерживает четыре базовые булевы операции для объектов
Path и CompoundPath:
Синтаксис:
var result = path1.unite(path2); // Объединение path1 и path2
result.fillColor = 'purple';
Особенности применения:
Path или
CompoundPath.Пример сложной композиции:
var circle = new Path.Circle([100, 100], 50);
var square = new Path.Rectangle([75, 75], [100, 100]);
var unionPath = circle.unite(square);
var hole = new Path.Circle([100, 100], 20);
var finalShape = unionPath.subtract(hole);
finalShape.fillColor = 'orange';
При работе с CompoundPath важна ориентация контура:
Метод reverse() меняет направление пути:
var inner = new Path.Circle([100, 100], 30);
inner.reverse(); // Сделает контур "дыркой"
compound.addChild(inner);
Неверное направление приводит к неправильной заливке при объединении фигур.
Для сложных булевых операций стоит использовать метод
simplify():
var complex = path1.unite(path2);
complex.simplify(2); // Уменьшает количество сегментов, сохраняя форму
Это полезно при анимациях и динамическом создании фигур, где большое количество точек может замедлять рендеринг.
CompoundPath поддерживает все стандартные трансформации
Paper.js:
compound.rotate(45); // Поворот всей композиции
compound.scale(1.5, 1.5); // Масштабирование
compound.translate([50, 50]); // Сдвиг
При трансформациях внутренние пути сохраняют относительные позиции, что обеспечивает корректное поведение при сложных комбинациях.
Анимации CompoundPath особенно эффективны при создании
эффектов вырезов, соединений и масок:
view.onFr ame = function(event) {
compound.rotate(1); // Постоянный вращающийся CompoundPath
};
Использование булевых операций совместно с анимацией позволяет создавать динамические интерактивные фигуры с плавными переходами между состояниями.
Этот подход делает Paper.js мощным инструментом для векторной графики, где сложные контуры, отверстия и объединения должны управляться программно, сохраняя структуру и возможность динамических изменений.