Snap.svg предоставляет мощный инструмент для работы с графикой через SVG, где важную роль играют трансформации объектов. Одним из ключевых механизмов управления трансформацией является использование матриц трансформации, которые позволяют изменять положение, масштаб, вращение и наклон объектов комплексно и точно.
В Snap.svg матрица трансформации представляет собой объект
Snap.Matrix, который хранит параметры аффинного
преобразования в виде шести чисел:
[a, b, c, d, e, f]
где:
a и d — масштабирование по X и Y, а также
косвенно вращение;b и c — элементы наклона (skew);e и f — смещение по X и Y
(translation).Математически матрица преобразования выглядит так:
[ ]
Эта матрица позволяет комбинировать несколько преобразований в одно, что критически важно для сложной графики.
Создание новой матрицы:
var matrix = new Snap.Matrix();
По умолчанию она является единичной, то есть не изменяет объект.
Применение матрицы к элементу:
var circle = s.circle(100, 100, 50);
circle.transform(matrix);
Метод transform() принимает строку трансформации или
объект матрицы. Если передан объект Snap.Matrix, Snap.svg
автоматически применяет преобразование.
Snap.Matrix предоставляет ряд методов для изменения матрицы:
matrix.translate(50, 30);
circle.transform(matrix);
(cx, cy):matrix.scale(2, 1.5, 100, 100);
circle.transform(matrix);
angle вокруг точки (cx, cy):matrix.rotate(45, 100, 100);
circle.transform(matrix);
matrix.skewX(20);
matrix.skewY(-15);
circle.transform(matrix);
Все эти методы модифицируют существующую матрицу, позволяя последовательно комбинировать трансформации.
Одним из мощных инструментов является объединение
матриц с помощью метода add():
var m1 = new Snap.Matrix();
var m2 = new Snap.Matrix();
m1.translate(50, 50);
m2.rotate(30);
m1.add(m2);
circle.transform(m1);
В результате объект сначала сдвигается, а затем поворачивается. Snap.svg использует матричное умножение, что гарантирует корректное применение нескольких трансформаций.
Для анализа текущей трансформации объекта используется метод
matrix:
var currentMatrix = circle.matrix;
console.log(currentMatrix.toString());
Метод toString() возвращает строку формата
matrix(a,b,c,d,e,f), которую можно использовать напрямую в
transform() или для экспорта.
var rect = s.rect(50, 50, 100, 50);
var bbox = rect.getBBox();
var m = new Snap.Matrix();
m.rotate(45, bbox.cx, bbox.cy);
rect.transform(m);
var ellipse = s.ellipse(200, 200, 80, 40);
var m = new Snap.Matrix();
m.translate(30, -20);
m.scale(1.5, 0.8, 200, 200);
m.skewX(15);
ellipse.transform(m);
var star = s.polygon([0,0, 50,100, 100,0]);
var m = new Snap.Matrix();
star.animate({ transform: m.rotate(360, 50, 50) }, 2000);
Использование матриц позволяет точно контролировать порядок преобразований, что особенно важно при сложных композициях, где вращение, масштаб и смещение должны работать синхронно.
animate, что открывает возможности для сложных
анимационных эффектов.