Snap.svg предоставляет мощный и гибкий инструмент для работы с векторной графикой в браузере. Одной из ключевых возможностей является управление трансформациями элементов. Трансформации в Snap.svg делятся на глобальные и локальные, и понимание различий между ними критично для правильного позиционирования и анимации объектов.
Локальная трансформация применяется к объекту относительно его собственной системы координат. Она не учитывает позицию родительского контейнера или других трансформаций на сцене. Основные методы для локальных трансформаций:
(cx, cy). Если координаты не указаны,
поворот осуществляется вокруг текущего центра объекта.(cx, cy).Пример локальной трансформации:
var s = Snap("#svg");
var rect = s.rect(50, 50, 100, 50);
rect.transform('t50,50r45');
В этом примере t50,50 смещает прямоугольник на 50
пикселей по обеим осям, а r45 поворачивает его на 45
градусов относительно центра прямоугольника после смещения. Порядок
трансформаций важен: сначала применяется смещение, затем поворот.
Особенности локальных трансформаций:
transform для комбинирования
нескольких трансформаций, например: 't20,30r30s2,2'.Глобальная трансформация влияет на объект с учётом всей сцены. Она применяется относительно исходной системы координат SVG или родительских элементов, объединяя эффекты всех предыдущих трансформаций.
Основные методы глобальной трансформации:
Snap.Matrix.Пример глобальной трансформации через матрицу:
var s = Snap("#svg");
var circle = s.circle(100, 100, 50);
var m = new Snap.Matrix();
m.translate(100, 50);
m.rotate(30);
circle.transform(m);
Здесь матрица сначала смещает окружность на (100,50), а
затем поворачивает на 30 градусов относительно глобальной системы
координат. В отличие от локальной трансформации, такие изменения
учитывают положение объекта на всей сцене и влияют на взаимодействие с
другими элементами.
Snap.svg предоставляет инструменты для конверсии координат:
Пример вычисления глобальной позиции точки:
var s = Snap("#svg");
var ellipse = s.ellipse(150, 100, 80, 40);
ellipse.transform('r45');
var ctm = ellipse.getCTM();
var globalPoint = ctm.transformPoint({x: 150, y: 100});
console.log(globalPoint);
Этот код вычисляет глобальное положение центра эллипса после
локального поворота. getCTM() позволяет корректно учитывать
все трансформации родительских элементов.
В Snap.svg каждая трансформация может быть представлена через матрицу 2D аффинного преобразования. Матрица имеет вид:
[ ]
Где:
(a, b) – определяют масштаб и вращение по X,(c, d) – масштаб и вращение по Y,(e, f) – смещение по X и Y.Пример использования матрицы для комбинированной трансформации:
var m = new Snap.Matrix();
m.scale(1.5, 1.5, 50, 50); // Масштабирование относительно точки (50,50)
m.rotate(30, 50, 50); // Поворот относительно той же точки
rect.transform(m);
Использование матриц позволяет точно управлять положением и ориентацией объектов, особенно когда необходимо комбинировать несколько трансформаций или анимировать их.
Snap.svg поддерживает анимацию локальных и глобальных трансформаций через метод animate(). Можно анимировать отдельные параметры, комбинировать трансформации и задавать длительность и функцию интерполяции.
Пример анимации:
rect.animate({ transform: 't100,0r90' }, 2000, mina.easeinout);
Этот код перемещает прямоугольник на 100 пикселей по X и поворачивает на 90 градусов за 2 секунды, используя плавное ускорение и замедление. Snap.svg корректно комбинирует локальные и глобальные трансформации при анимации.
Использование этих принципов позволяет создавать сложные интерактивные визуализации, точные анимации и управлять объектами на уровне матриц, что обеспечивает высокий контроль над графикой и динамическими эффектами в Snap.svg.