Paper.js предоставляет гибкий и удобный способ работы с графическими объектами, создаваемыми на основе данных из внешних источников. JSON (JavaScript Object Notation) является одним из наиболее распространённых форматов для хранения структурированных данных, включая координаты, параметры фигур, цвета и анимационные настройки. Возможность загружать и использовать JSON-файлы позволяет создавать динамическую графику и сложные визуализации без ручного прописывания каждого объекта.
Для загрузки JSON в Paper.js используются стандартные средства
JavaScript, такие как fetch или
XMLHttpRequest. На практике предпочтение отдаётся
fetch, так как он работает асинхронно и возвращает
промисы:
fetch('data/shapes.json')
.then(response => response.json())
.then(data => processData(data))
.catch(error => console.error('Ошибка загрузки JSON:', error));
В данном примере data/shapes.json — это файл с набором
объектов, содержащих свойства фигур, например:
[
{ "type": "circle", "center": [100, 150], "radius": 50, "fillColor": "#ff0000" },
{ "type": "rectangle", "point": [200, 100], "size": [120, 80], "fillColor": "#00ff00" }
]
После загрузки данных необходимо преобразовать JSON-структуру в объекты Paper.js. Обычно создаются функции, которые по типу фигуры и её параметрам вызывают соответствующие методы Paper.js:
function processData(data) {
data.forEach(item => {
switch(item.type) {
case 'circle':
new paper.Path.Circle({
center: item.center,
radius: item.radius,
fillColor: item.fillColor
});
break;
case 'rectangle':
new paper.Path.Rectangle({
point: item.point,
size: item.size,
fillColor: item.fillColor
});
break;
case 'path':
const path = new paper.Path({
segments: item.segments,
closed: item.closed || false,
strokeColor: item.strokeColor
});
break;
}
});
paper.view.update();
}
Ключевые моменты:
paper.Path.Circle и paper.Path.Rectangle
создают базовые геометрические фигуры.fillColor и strokeColor могут
быть представлены как HEX-кодами, так и стандартными названиями
цветов.paper.Path с массивом
сегментов, что позволяет строить произвольные линии и кривые.JSON может использоваться не только для статического создания объектов, но и для динамического изменения их параметров. Например, можно периодически загружать новый JSON и обновлять позиции или размеры фигур:
function updateShapes(newData) {
paper.project.activeLayer.removeChildren();
processData(newData);
}
setInterval(() => {
fetch('data/shapes.json')
.then(response => response.json())
.then(data => updateShapes(data));
}, 5000);
Такой подход позволяет реализовать анимации и интерактивные визуализации на основе внешних данных без ручного изменения кода.
JSON может содержать вложенные структуры, например, группы объектов
или массивы сегментов для сложных путей. Paper.js поддерживает
группировку объектов через paper.Group:
function createGroupFromJSON(groupData) {
const group = new paper.Group();
groupData.items.forEach(item => {
const shape = createShape(item);
group.addChild(shape);
});
return group;
}
function createShape(item) {
switch(item.type) {
case 'circle':
return new paper.Path.Circle({
center: item.center,
radius: item.radius,
fillColor: item.fillColor
});
case 'rectangle':
return new paper.Path.Rectangle({
point: item.point,
size: item.size,
fillColor: item.fillColor
});
}
}
Группы позволяют изменять свойства сразу всех вложенных объектов: позицию, масштаб, поворот, прозрачность.
JSON удобно использовать для описания ключевых кадров и анимационных свойств. Например, структура может включать массив координат и времени:
[
{ "time": 0, "center": [100, 150] },
{ "time": 1, "center": [200, 150] },
{ "time": 2, "center": [300, 200] }
]
Для реализации интерполяции и плавного движения используется
paper.view.onFrame:
let startTime = null;
function animateShape(data, shape) {
paper.view.onFr ame = (event) => {
if (!startTime) startTime = event.time;
const t = event.time - startTime;
const keyframe = data.find(kf => kf.time >= t) || data[data.length - 1];
shape.position = keyframe.center;
};
}
Работа с JSON в Paper.js обеспечивает мощный инструмент для построения интерактивной и динамической графики, позволяя разделить данные и визуализацию, а также создавать комплексные анимации на основе структурированных данных.