Snap.svg предоставляет удобный способ создания и управления векторной графикой в браузере с использованием языка JavaScript. Одним из ключевых аспектов работы с элементами SVG является понимание координатной системы. В Snap.svg различают абсолютные и относительные координаты, что особенно важно при построении сложных графических объектов, анимации и трансформаций.
Абсолютные координаты задаются относительно координатной системы SVG-контейнера. Это фиксированные значения, которые определяют точное положение точки на холсте.
Пример создания прямоугольника с абсолютными координатами:
var s = Snap(800, 600);
var rect = s.rect(100, 50, 200, 100); // x=100, y=50, width=200, height=100
rect.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 4
});
В этом примере координата x=100 и y=50
определяют верхний левый угол прямоугольника относительно начала
координат SVG-контейнера. Любые изменения этих значений перемещают
объект по абсолютной позиции на холсте.
Ключевой момент: Абсолютные координаты удобны для точного позиционирования объектов, но при сложных вложенных структурах (группы, трансформации) они могут затруднить управление элементами, так как координаты не учитывают локальные преобразования.
Относительные координаты определяют положение точки
относительно текущего положения или родительского
элемента. Они особенно полезны при работе с анимацией, группами
(<g>), и при создании сложных композиционных
элементов.
Snap.svg поддерживает относительные координаты через методы
трансформации, например, translate, rotate и
scale.
Пример использования относительных координат для смещения:
var circle = s.circle(150, 150, 50);
circle.attr({
fill: "#e74c3c"
});
// Смещение на 100 по x и 50 по y относительно текущего положения
circle.transform("t100,50");
Здесь "t100,50" означает translation —
смещение объекта на указанное количество единиц координат относительно
его текущей позиции.
Особенность: При последовательных трансформациях относительно текущего положения координаты накапливаются, что позволяет создавать сложные анимации без пересчета абсолютных значений.
Snap.svg предоставляет методы для преобразования точек из локальной системы координат элемента в глобальную и наоборот:
el.getBBox() — возвращает ограничивающий
прямоугольник элемента в абсолютных координатах.el.matrix — объект матрицы трансформации элемента.el.getCTM() — возвращает текущую матрицу
преобразований, учитывающую все трансформации родительских
элементов.Пример:
var rect = s.rect(50, 50, 100, 100);
rect.transform("t30,40 r45"); // Смещение и поворот
var ctm = rect.getCTM();
console.log(ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f);
Матрица CTM позволяет вычислить абсолютное положение любого объекта, даже если он находится внутри нескольких вложенных групп с трансформациями.
Группировка элементов (g) облегчает управление
относительными координатами, так как трансформации применяются ко всей
группе одновременно.
var group = s.group();
var circle1 = s.circle(50, 50, 30);
var circle2 = s.circle(150, 50, 30);
group.add(circle1, circle2);
// Перемещение всей группы на 100 по x и 50 по y
group.transform("t100,50");
В этом примере каждая фигура внутри группы сохраняет свои локальные координаты, но визуально перемещается вместе с группой. Это особенно удобно при создании сложных сцен с множеством элементов.
Создание сложной фигуры с использованием относительных координат:
var star = s.group();
var points = [
[0, -50], [14, -15], [47, -15],
[23, 7], [29, 40], [0, 25],
[-29, 40], [-23, 7], [-47, -15], [-14, -15]
];
points.forEach(function(p) {
star.add(s.circle(p[0], p[1], 5).attr({fill: "#f1c40f"}));
});
// Перемещение всей звезды в центр холста
star.transform("t400,300");
Здесь каждая точка задается относительно центра звезды, а затем вся фигура перемещается как единое целое.
Использовать абсолютные координаты, когда требуется точное позиционирование объектов на холсте без зависимости от других элементов.
Использовать относительные координаты, когда нужно:
Эффективное сочетание абсолютных и относительных координат позволяет создавать интерактивные и динамические графические сцены в Snap.svg, обеспечивая контроль над точным положением объектов и гибкость при трансформациях.