В Paper.js каждое визуальное содержимое размещается в сцене
(project), которая отображается на холсте
<canvas>. Все объекты имеют свои координаты
относительно пространства проекта, но при этом Paper.js
использует локальные координаты элементов через их
собственные трансформации.
Различие между пространствами критично для корректного управления положением, размером и вращением объектов. Основные виды пространств:
Каждый объект Paper.js наследует свойства и методы для работы с преобразованиями:
Matrix, описывающий
текущую трансформацию объекта.Matrix в Paper.js представляет собой аффинное
преобразование с параметрами a, b, c, d, tx, ty, где:
[a c tx]
[b d ty]
[0 0 1]
Эта матрица описывает одновременно:
a и
d.b и c.tx
и ty.Создание и применение матриц:
var matrix = new Matrix();
matrix.translate(100, 50);
matrix.rotate(45);
path.transform(matrix);
Методы translate(), rotate(),
scale() вызываются на матрице и позволяют комбинировать
несколько преобразований перед применением к объекту.
Paper.js предоставляет удобные методы для перевода координат из одного пространства в другое:
Пример:
var circle = new Path.Circle(new Point(150, 150), 50);
circle.rotate(30);
var localPoint = circle.globalToLocal(new Point(160, 160));
console.log(localPoint); // координата в системе круга
Это важно для точного взаимодействия с объектами, особенно при сложных трансформациях.
Группы (Group) в Paper.js создают иерархическое
пространство:
Пример:
var group = new Group();
var rect = new Path.Rectangle([0, 0], [50, 50]);
var circle = new Path.Circle([100, 100], 25);
group.addChild(rect);
group.addChild(circle);
group.translate(new Point(50, 50));
console.log(rect.position); // позиция изменена относительно глобального пространства
Методы localToGlobal() и globalToLocal()
применимы также к объектам внутри групп, учитывая трансформации
родителей.
View в Paper.js обеспечивает связь между координатами холста и координатами экрана:
event.point в координаты проекта:tool.onMouseD own = function(event) {
var projectPoint = view.viewToProject(event.point);
var hitResult = project.hitTest(projectPoint);
if (hitResult) {
hitResult.item.fillColor = 'red';
}
};
Это гарантирует точное попадание мыши в объекты вне зависимости от масштаба или смещения холста.
Часто требуется объединять несколько трансформаций:
translate,
rotate, scale последовательно приводит к
композиции аффинных преобразований.matrix.inverted(), что позволяет возвращать объекты и точки
в исходное пространство.Пример инверсии:
var matrix = new Matrix();
matrix.translate(100, 0);
matrix.rotate(45);
var inverted = matrix.inverted();
var originalPoint = inverted.transform(new Point(150, 50));
applyMatrix = true оптимизирует рендеринг
для объектов с постоянными преобразованиями.Понимание и грамотное использование пространственных преобразований в Paper.js позволяет создавать сложные интерактивные сцены с точной локализацией объектов и управлением анимацией.