В SVG.js для создания сложных графических фигур используется объект
Path, который представляет произвольный путь. Путь состоит
из последовательности команд, описывающих движение пера по координатной
плоскости. Каждая команда имеет буквенный идентификатор и набор числовых
параметров.
Создание простого пути осуществляется через метод
draw.path(). Пример:
const draw = SVG().addTo('body').size(500, 500);
const path = draw.path('M50 50 L150 50 L150 150 L50 150 Z')
.fill('none')
.stroke({ color: '#f06', width: 3 });
Объяснение команд пути:
M x y – перемещение пера в точку (x, y)
без рисования линии.L x y – линейная сегментная линия до точки
(x, y).H x и V y – горизонтальное или
вертикальное перемещение соответственно.C x1 y1, x2 y2, x y – кубическая кривая Безье.S x2 y2, x y – сглаженная кубическая кривая Безье.Q x1 y1, x y – квадратичная кривая Безье.T x y – сглаженная квадратичная кривая Безье.Z – закрытие пути (соединение последней точки с
первой).Каждая команда может использоваться как в абсолютной
(M, L, C) форме, так и в
относительной (m, l,
c) форме, где координаты считаются относительно текущей
позиции пера.
Кубическая кривая Безье определяется командой
C x1 y1, x2 y2, x y.
(x1, y1) и (x2, y2) – контрольные точки,
определяющие форму кривой.(x, y) – конечная точка сегмента кривой.Пример построения S-образной кривой:
const curve = draw.path('M50 250 C150 100, 350 400, 450 250')
.fill('none')
.stroke({ color: '#00f', width: 4 });
Для упрощения касательных при последовательных кривых используется
команда S. Она автоматически рассчитывает первую
контрольную точку зеркально относительно предыдущей кривой.
const smoothCurve = draw.path('M50 250 C150 100, 350 400, 450 250 S550 100, 650 250')
.fill('none')
.stroke({ color: '#0a0', width: 3 });
Квадратичная кривая задаётся командой Q x1 y1, x y:
(x1, y1) – единственная контрольная точка.(x, y) – конечная точка кривой.Пример:
const quadCurve = draw.path('M50 350 Q250 150, 450 350')
.fill('none')
.stroke({ color: '#f80', width: 3 });
Команда T позволяет создавать сглаженные квадратичные
кривые, автоматически рассчитывая контрольную точку на основе
предыдущего сегмента.
plot()Метод plot() позволяет динамически изменять путь после
его создания:
path.plot('M100 100 L300 100 L300 300 L100 300 Z');
move(), size()Путь можно перемещать и масштабировать:
path.move(50, 50);
path.size(200, 200);
bbox()Возвращает ограничивающий прямоугольник пути:
const box = path.bbox();
console.log(box.x, box.y, box.width, box.height);
length() и
pointAt()Для кривых важно вычислять длину и точки на пути:
const length = path.length();
const point = path.pointAt(length / 2); // точка посередине пути
draw.path('M50 50 L150 50 C200 50, 200 150, 150 150 L50 150 Z')
.fill('lightblue')
.stroke({ color: 'blue', width: 2 });
draw.path('M0 200 C50 100, 150 300, 200 200 S350 100, 400 200')
.fill('none')
.stroke({ color: '#f00', width: 2 });
const circle = draw.circle(20).fill('#0f0');
circle.animate(3000).during((pos) => {
const point = path.pointAt(pos * path.length());
circle.center(point.x, point.y);
});
S или
T.Путь в SVG.js можно рассматривать как последовательность сегментов, каждый сегмент имеет тип (линия, квадратичная или кубическая кривая) и набор координат. Комбинируя эти сегменты, создаются любые сложные формы, от простых многоугольников до плавных волнистых кривых и анимированных траекторий движения объектов.