Snap.svg предоставляет мощный инструментарий для работы с векторной графикой в браузере, включая операции над путями. Одной из ключевых возможностей является вычитание одного пути из другого, что позволяет создавать сложные формы из базовых элементов.
В Snap.svg пути представляются объектами типа Path,
создаваемыми с помощью функции paper.path(). Путь задаётся
строкой в формате SVG, содержащей команды типа M,
L, C, Q, Z:
var paper = Snap(800, 600);
var path1 = paper.path("M100,100 L300,100 L300,300 L100,300 Z"); // квадрат
var path2 = paper.path("M200,200 L400,200 L400,400 L200,400 Z"); // другой квадрат
Здесь path1 и path2 — два квадратных
объекта, частично пересекающихся.
Snap.path.subtract()Для вычитания одного пути из другого используется метод
Snap.path.subtract(pathA, pathB). Он возвращает новый путь,
который представляет собой геометрию pathA за
вычетом pathB.
var resultPath = Snap.path.subtract(path1, path2);
paper.path(resultPath).attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 2
});
Особенности метода:
pathA и pathB могут быть как
строками SVG, так и объектами Snap Path.Вычесление путей часто используется вместе с другими булевыми операциями Snap.svg:
Snap.path.union(pathA, pathB) — объединение двух
путей.Snap.path.intersection(pathA, pathB) — пересечение
путей.Snap.path.exclude(pathA, pathB) — симметрическая
разность.Эти методы позволяют создавать сложные фигуры без ручного расчёта координат.
var circle = paper.circle(250, 250, 100);
var rectangle = paper.rect(200, 200, 150, 150);
var subtractResult = Snap.path.subtract(circle, rectangle);
paper.path(subtractResult).attr({
fill: "#e74c3c",
stroke: "#c0392b",
strokeWidth: 2
});
В этом примере из круга вычитается прямоугольник, формируя форму с «выемкой».
pathA - pathB и
pathB - pathA дают разные формы.Z). Открытые пути могут приводить к некорректным
результатам.Snap.path.toCubic() или
упрощения кривых.Вычитание путей позволяет:
var star = paper.path("M250,150 L280,250 L370,250 L300,310 L320,400 L250,350 L180,400 L200,310 L130,250 L220,250 Z");
var hole = paper.circle(250, 250, 50);
var cutStar = Snap.path.subtract(star, hole);
paper.path(cutStar).attr({
fill: "#f1c40f",
stroke: "#f39c12",
strokeWidth: 3
});
В этом примере создаётся звезда с вырезанным кругом в центре, демонстрируя гибкость операций вычитания для декоративной графики.
Snap.path.toCubic()
для унификации кривых перед вычитанием.fill, stroke,
strokeWidth для визуального отделения результата от
исходных объектов.Этот подход позволяет создавать выразительные графические конструкции в браузере, полностью управляемые через JavaScript, без необходимости ручного редактирования SVG.