В библиотеке Snap.svg каждая графическая фигура, будь то круг,
прямоугольник, эллипс или многоугольник, изначально создается как
отдельный элемент с собственными атрибутами. Однако для сложных
манипуляций с формой или для анимации вдоль кривой часто необходимо
преобразовать фигуру в путь (<path>), поскольку
именно путь предоставляет полный контроль над точками и сегментами
кривой.
Snap.svg реализует это через метод .toPath(), который
возвращает новый элемент <path>, полностью
повторяющий форму исходной фигуры.
var s = Snap(400, 400);
var circle = s.circle(200, 200, 50);
var path = circle.toPath();
В этом примере круг преобразуется в путь, при этом каждый сегмент
окружности становится частью команды пути C (кубическая
кривая Безье).
.toPath()Метод .toPath() поддерживает все основные типы фигур
Snap.svg:
Круг (circle) и Эллипс
(ellipse) Преобразование окружности или эллипса в
путь создаёт кривую Безье, состоящую из четырёх сегментов. При этом
сохраняются координаты центра и радиусы:
var ellipse = s.ellipse(150, 100, 80, 50);
var pathEllipse = ellipse.toPath();
console.log(pathEllipse.attr("d"));
// Выведет команды M и C для кривойПрямоугольник (rect) Для
прямоугольника путь создается из четырёх линий, соединяющих вершины, с
учётом радиуса скругления углов (rx, ry):
var rect = s.rect(50, 50, 100, 80, 10, 10);
var pathRect = rect.toPath();
Если у прямоугольника нет скругленных углов, результат — просто линии
L между вершинами.
Линия (line) Линия превращается в
путь с двумя точками: начальной и конечной:
var line = s.line(10, 10, 100, 100);
var pathLine = line.toPath();Многоугольник (polygon) и полилиния
(polyline) Каждый узел превращается в сегмент пути
L, а для многоугольника автоматически добавляется замыкание
Z.
После преобразования фигуры в путь доступен атрибут d,
содержащий строку с командами SVG Path. Эти команды можно редактировать
напрямую или использовать Snap.svg для манипуляций:
M x,y – перемещение к точке без
рисованияL x,y – линия до точкиC x1,y1 x2,y2 x,y – кубическая кривая
БезьеQ x1,y1 x,y – квадратичная кривая
БезьеZ – закрытие контураvar pathData = path.attr("d");
// Пример добавления сегмента линии
path.attr({ d: pathData + " L300,300" });
После конвертации фигуры в путь появляется возможность анимировать её
форму. Метод Snap.svg .animate() позволяет плавно
трансформировать один путь в другой:
var rectPath = s.rect(50, 50, 100, 80).toPath();
var circlePath = s.circle(150, 150, 70).toPath();
rectPath.animate({ d: circlePath.attr("d") }, 1000, mina.easeinout);
Ключевой момент: исходный и целевой пути должны иметь совместимое количество сегментов для корректного морфинга. В противном случае анимация может выглядеть искажённой.
cx, cy, r для круга и
т.д.)..getPointAtLength(),
.getTotalLength(), .map(), что облегчает
работу с кривыми после конвертации.Конвертация фигур в путь особенно полезна при:
Использование .toPath() превращает Snap.svg из
инструмента простого построения графики в мощный движок для точной
работы с векторными кривыми и анимациями.