Сглаживание (smooth) в библиотеке Paper.js — это процесс изменения геометрии пути с целью устранения резких углов и создания плавных переходов между сегментами. Основная задача — перераспределить управляющие точки и их векторы таким образом, чтобы кривая выглядела естественно и непрерывно.
В основе лежит работа с кривыми Безье, где каждый сегмент пути
описывается двумя управляющими векторами (handleIn и
handleOut). Сглаживание автоматически корректирует эти
векторы.
Путь (Path) состоит из массива сегментов
(Segment), каждый из которых содержит:
point)handleIn)handleOut)Сглаживание воздействует именно на handleIn и
handleOut, не изменяя сами координаты точек (за исключением
некоторых режимов).
Пример структуры сегмента:
{
point: new Point(x, y),
handleIn: new Point(dx1, dy1),
handleOut: new Point(dx2, dy2)
}
Метод smooth() применяется к пути и автоматически
рассчитывает сглаженные значения управляющих векторов.
path.smooth();
После вызова:
Paper.js предоставляет несколько алгоритмов сглаживания, позволяющих контролировать результат.
path.smooth({ type: 'continuous' });
Особенности:
Используется в большинстве случаев, особенно при работе с произвольными формами.
path.smooth({ type: 'asymmetric' });
Особенности:
path.smooth({ type: 'catmull-rom' });
Особенности:
Можно дополнительно задать параметр factor:
path.smooth({
type: 'catmull-rom',
factor: 0.5
});
Где factor определяет “натяжение” кривой:
path.smooth({ type: 'geometric' });
Особенности:
Сглаживание можно применить не ко всему пути, а только к части сегментов:
path.smooth({
from: 2,
to: 5
});
Это полезно, если:
path.closed = true;
path.smooth();
Особенности:
Чем больше сегментов в пути:
Однако:
Оптимальный подход — умеренное количество точек + сглаживание.
var path = new Path();
path.add(new Point(50, 50));
path.add(new Point(150, 100));
path.add(new Point(250, 50));
path.add(new Point(350, 150));
path.strokeColor = 'black';
// сглаживание
path.smooth();
Результат:
Часто используется вместе с инструментами рисования:
var path;
tool.onMouseD own = function(event) {
path = new Path();
path.strokeColor = 'black';
path.add(event.point);
};
tool.onMouseD rag = function(event) {
path.add(event.point);
};
tool.onMous eUp = function(event) {
path.smooth();
};
Такой подход:
Метод smooth() можно вызывать несколько раз:
path.smooth();
path.smooth();
Эффект:
Важно соблюдать баланс, чтобы не потерять исходную геометрию.
Метод simplify() уменьшает количество сегментов:
path.simplify();
path.smooth();
Комбинация:
Результат:
После сглаживания можно дополнительно корректировать форму:
var segment = path.segments[1];
segment.handleIn = new Point(-20, 0);
segment.handleOut = new Point(20, 0);
Это позволяет:
1. Потеря формы
Слишком сильное сглаживание может:
2. Недостаток сегментов
Если сегментов мало:
3. Избыточные сегменты
Слишком много точек:
применять smooth() после завершения построения
пути
комбинировать с simplify() для оптимизации
выбирать режим сглаживания в зависимости от задачи:
continuous — универсальный вариантcatmull-rom — для естественных линийgeometric — для точных формизбегать многократного сглаживания без необходимости
контролировать количество сегментов
Сглаживание — вычислительно затратная операция:
Оптимизация:
smooth() в каждом кадреfrom,
to)При анимации путей:
Пример:
function onFrame(event) {
path.segments[1].point.x += Math.sin(event.time) * 2;
path.smooth();
}
Важно учитывать:
| Режим | Характеристика | Применение |
|---|---|---|
| continuous | плавный и стабильный | универсальные задачи |
| asymmetric | свободная форма | органические линии |
| catmull-rom | проходит через точки | естественные траектории |
| geometric | геометрическая точность | технические чертежи |
Сглаживание влияет не только на геометрию, но и на восприятие:
Особенно важно в: