В Paper.js каждый графический объект является экземпляром класса Item или его потомков, таких как Path, Group, Raster и Shape. Для управления положением объекта используются свойства position, pivot, bounds, а также методы translate, rotate, scale.
Пример установки позиции:
let circle = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'red'
});
circle.position = new Point(200, 150);
Paper.js не имеет встроенной системы автоматического выравнивания, как CSS в веб-разработке, но можно легко реализовать выравнивание через свойства bounds и position.
Для центрирования объекта относительно другого объекта или холста используется bounds.center:
let rect = new Path.Rectangle({
point: [0, 0],
size: [100, 50],
fillColor: 'blue'
});
// Центрирование относительно холста
rect.position = view.center;
Для выравнивания по левому, правому или верхнему краю применяются bounds.left, bounds.right, bounds.top, bounds.bottom:
rect.bounds.left = 50; // Смещение к координате x = 50 слева
rect.bounds.top = 20; // Смещение к координате y = 20 сверху
Группировка объектов через Group позволяет управлять их позиционированием совместно. При этом координаты группы определяются как прямоугольник, охватывающий все элементы:
let circle1 = new Path.Circle([50, 50], 20);
let circle2 = new Path.Circle([150, 80], 30);
let group = new Group([circle1, circle2]);
group.position = view.center; // Центрирование всей группы на холсте
Для точного выравнивания отдельных элементов внутри группы используют item.position и item.bounds.
translate() позволяет перемещать объекты на заданный вектор:
circle.translate(new Point(50, 0)); // Сдвиг на 50 пикселей вправо
rotate(angle, point) поворачивает объект на угол angle вокруг точки point. Если точка не указана, используется pivot:
rect.rotate(45, rect.bounds.center);
scale(factor, point) масштабирует объект. При масштабировании вокруг центра объекта используется pivot:
rect.scale(1.5, rect.bounds.center); // Увеличение на 50%
Paper.js использует иерархию объектов: вложенные объекты наследуют трансформации родителя. Это особенно важно при позиционировании сложных сцен:
Для независимого позиционирования дочерних объектов внутри группы необходимо управлять их position и bounds локально, учитывая координаты родителя:
let group = new Group();
let rect = new Path.Rectangle([0,0], [100,50]);
let circle = new Path.Circle([50,25], 20);
group.addChild(rect);
group.addChild(circle);
circle.position = rect.bounds.rightCenter + new Point(30, 0); // Сдвиг относительно прямоугольника
Для равномерного распределения нескольких объектов по горизонтали или вертикали можно использовать массивы и вычисление промежутков:
let items = [];
for (let i = 0; i < 5; i++) {
items.push(new Path.Circle([0,0], 20));
}
// Распределение по горизонтали на 500px
let spacing = 500 / (items.length + 1);
items.forEach((item, index) => {
item.position = new Point((index + 1) * spacing, view.center.y);
});
Для интерфейсов и динамических сцен важно позиционировать объекты относительно размеров окна. Свойство view.bounds содержит текущие границы холста:
let topRightCircle = new Path.Circle(view.bounds.topRight - new Point(30, -30), 20);
topRightCircle.fillColor = 'green';
Использование view.onResize позволяет поддерживать корректное выравнивание при изменении размеров окна:
view.onRes ize = function() {
topRightCircle.position = view.bounds.topRight - new Point(30, -30);
};
Эти методы обеспечивают полное управление позиционированием, выравниванием и трансформациями объектов в Paper.js, создавая основу для динамичных и структурированных графических сцен.