В Paper.js каждый объект (Path, Raster,
Group, Layer) располагается в координатной
системе холста. Основная единица измерения — пиксели, а точка
(0, 0) находится в левом верхнем углу канваса. Понимание
координатной системы критично для точного размещения объектов и их
последующего масштабирования.
Свойства позиции объектов:
position — центральная точка объекта, используется для
смещения и центрирования.bounds — прямоугольник, охватывающий объект; имеет
свойства topLeft, topRight,
bottomLeft, bottomRight,
center.pivot — точка поворота и масштабирования относительно
объекта (по умолчанию совпадает с position).Пример установки позиции:
let circle = new Path.Circle({
center: [150, 100],
radius: 50,
fillColor: 'blue'
});
circle.position = new Point(200, 150);
Point — объект Paper.js для представления координат,
позволяющий выполнять операции сложения, вычитания и масштабирования
векторно.
Масштабирование в Paper.js производится методом
scale(factor, center), где factor может быть
числом или объектом Point, а center — точка,
относительно которой выполняется масштабирование.
Ключевые моменты:
scale(2) увеличивает объект
в 2 раза по всем осям.scale(new Point(2, 0.5)) увеличивает по X и сжимает по
Y.Пример масштабирования относительно верхнего левого угла объекта:
let rect = new Path.Rectangle({
point: [50, 50],
size: [100, 80],
fillColor: 'green'
});
rect.scale(1.5, rect.bounds.topLeft);
Объекты в Paper.js можно объединять в группы (Group).
Масштабирование группы автоматически применяет трансформацию ко всем
дочерним элементам, сохраняя относительные позиции и размеры.
let circle1 = new Path.Circle([50, 50], 30);
circle1.fillColor = 'red';
let circle2 = new Path.Circle([150, 50], 30);
circle2.fillColor = 'blue';
let group = new Group([circle1, circle2]);
group.scale(2, new Point(100, 50));
Здесь каждая окружность увеличивается вдвое относительно точки
[100, 50], сохраняя пропорции и взаимное расположение.
matrix для точного управленияДля более сложных операций Paper.js предоставляет матричные
трансформации (Matrix). Через Matrix можно
комбинировать масштабирование, поворот и смещение в одной операции.
Создание и применение матрицы:
let matrix = new Matrix();
matrix.translate(50, 30);
matrix.scale(2, 2, new Point(100, 100));
matrix.rotate(45, new Point(100, 100));
rect.transform(matrix);
Преимущество подхода в том, что все изменения сохраняются в виде матричной трансформации, позволяя откатывать или повторно применять её к другим объектам.
Raster)Raster объекты поддерживают не только позицию, но и
разрешение исходного изображения. Масштабирование производится через
scale, аналогично Path:
let raster = new Raster('image.jpg');
raster.position = view.center;
raster.scale(0.5); // Уменьшение до 50%
Важно помнить, что слишком сильное увеличение растрового объекта приведёт к размытому изображению из-за ограничений пиксельного разрешения.
Paper.js поддерживает плавные изменения позиции и масштаба через
метод onFrame, позволяя создавать динамическую
визуализацию:
circle.onFr ame = function(event) {
let scaleFactor = 1 + 0.01 * Math.sin(event.count / 10);
circle.scale(scaleFactor, circle.position);
};
Каждый кадр вычисляет новое значение масштаба относительно центральной точки объекта, создавая эффект «дыхания» фигуры.
bounds для позиционирования объектов
относительно краев холста.Matrix.pivot или
передаваемую точку), иначе объект будет смещаться неожиданным
образом.