ImportJSON и загрузка из JSON

Paper.js предоставляет гибкий и удобный способ работы с графическими объектами, создаваемыми на основе данных из внешних источников. JSON (JavaScript Object Notation) является одним из наиболее распространённых форматов для хранения структурированных данных, включая координаты, параметры фигур, цвета и анимационные настройки. Возможность загружать и использовать JSON-файлы позволяет создавать динамическую графику и сложные визуализации без ручного прописывания каждого объекта.

Загрузка 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

После загрузки данных необходимо преобразовать 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

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

  • Универсальность — данные могут генерироваться сервером или другими приложениями.
  • Масштабируемость — легко добавлять новые объекты или изменять существующие без переписывания кода.
  • Совместимость — JSON поддерживается большинством языков программирования, что облегчает интеграцию с внешними источниками данных.

Работа с JSON в Paper.js обеспечивает мощный инструмент для построения интерактивной и динамической графики, позволяя разделить данные и визуализацию, а также создавать комплексные анимации на основе структурированных данных.