В Snap.svg каждая графическая фигура или группа элементов имеет
собственную систему координат, которая управляется
через матрицу трансформаций. Для получения и работы с текущей матрицей
используется метод getCTM(), который возвращает
текущую матрицу преобразований элемента относительно
его родителя.
getCTM()Синтаксис:
var matrix = element.getCTM();
rect, circle,
path, g).SVGMatrix, содержащий
текущие параметры преобразования.Возвращаемый объект SVGMatrix содержит свойства:
a — масштабирование по оси X.b — наклон по оси Y.c — наклон по оси X.d — масштабирование по оси Y.e — смещение по оси X.f — смещение по оси Y.Пример получения матрицы:
var s = Snap(400, 400);
var rect = s.rect(50, 50, 100, 100);
rect.transform("t100,50r45");
var matrix = rect.getCTM();
console.log(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f);
В этом примере прямоугольник сначала смещается на
(100, 50), затем поворачивается на 45°. Метод
getCTM() возвращает комбинированную
матрицу, учитывающую все примененные трансформации.
Текущая матрица трансформаций особенно полезна при:
matrix.transformPoint(x, y):var point = matrix.transformPoint(0, 0);
console.log(point.x, point.y);
var currentMatrix = rect.getCTM();
rect.transform(currentMatrix.toTransformString() + "t50,0");
<g>) матрица учитывает все
трансформации родительских групп, что позволяет правильно
позиционировать дочерние элементы.Объект SVGMatrix можно преобразовать обратно в строку,
которую понимает Snap.svg:
var transformString = matrix.toTransformString();
rect.transform(transformString);
Это полезно, когда необходимо сохранить текущее состояние элемента и повторно применить его позже.
getCTM() от
transform()transform() возвращает строку всех локальных
трансформаций элемента, в том виде, в каком они были заданы
(t, r, s, m).getCTM() возвращает абсолютную матрицу
относительно SVG-контейнера, учитывающую все родительские
трансформации.Пример различия:
rect.transform("t100,50r30");
console.log(rect.transform()); // "t100,50r30"
console.log(rect.getCTM()); // матрица с учетом поворота и смещения
<g>)При работе с группами текущая матрица учитывает трансформации всех родителей:
var group = s.group(rect);
group.transform("t50,50");
var matrix = rect.getCTM();
В этом случае matrix.e и matrix.f будут
включать смещение как элемента, так и группы, что позволяет точно
вычислять позицию элемента на канве.
s.click(function(event) {
var point = s.node.createSVGPoint();
point.x = event.clientX;
point.y = event.clientY;
var ctm = rect.getCTM().inverse();
var local = point.matrixTransform(ctm);
console.log(local.x, local.y); // координаты клика внутри rect
});
Здесь используется обратная матрица
(inverse()), чтобы преобразовать глобальные координаты мыши
в локальные координаты элемента. Это часто применяют для интерактивных
приложений и drag-and-drop интерфейсов.
getCTM(), чтобы учитывать все предыдущие
изменения.transform().getCTM() обеспечивают корректное
позиционирование и взаимодействие элементов.Метод getCTM() является ключевым инструментом
Snap.svg для точного контроля позиции и трансформаций, особенно
когда требуется работа с координатами в глобальной системе SVG или
комбинирование сложных трансформаций.