В библиотеке SVG.js каждая трансформация объекта — будь то поворот, масштабирование или сдвиг — осуществляется относительно точки трансформации (transform origin). По умолчанию эта точка совпадает с левым верхним углом элемента, но её можно менять для достижения точного эффекта. Правильное понимание точки трансформации критично для сложных анимаций и группировок элементов.
В SVG.js для задания точки трансформации
используется метод transform() с объектом, содержащим
параметры cx и cy:
const rect = draw.rect(100, 50).fill('#f06');
rect.transform({ cx: 50, cy: 25 });
После установки этих значений все последующие трансформации будут применяться относительно указанной точки.
Поворот (rotate) без указания точки трансформации
производится относительно стандартной точки (левый верхний угол). Если
необходимо вращение вокруг центра или произвольной точки, важно сначала
определить cx и cy:
rect.transform({ cx: 50, cy: 25 }).rotate(45);
Здесь прямоугольник поворачивается на 45 градусов вокруг точки (50, 25) внутри элемента, а не вокруг угла.
Трансформация scale также зависит от точки
трансформации. При масштабировании относительно центра элемент
увеличивается или уменьшается вокруг заданной точки:
rect.transform({ cx: 50, cy: 25 }).scale(2);
Результат: прямоугольник удваивается в размерах, оставаясь
“привязанным” к точке (50, 25). Без указания cx и
cy элемент смещается, так как масштаб применяется
относительно угла.
Метод transform() позволяет комбинировать несколько
трансформаций сразу:
rect.transform({
cx: 50,
cy: 25,
rotate: 30,
scale: 1.5,
translateX: 20,
translateY: 10
});
cx, cy.Порядок применения этих трансформаций критичен: сначала
масштабирование, затем поворот, потом смещение. SVG.js
автоматически управляет порядком при использовании объекта в
transform().
Группировка элементов через group() позволяет задавать
одну точку трансформации для всех элементов внутри:
const group = draw.group();
const circle = group.circle(50).fill('blue');
const square = group.rect(50, 50).fill('red');
group.transform({ cx: 50, cy: 50, rotate: 45 });
Группа будет вращаться как единый объект вокруг точки (50, 50), сохраняя относительное расположение всех дочерних элементов.
Часто требуется установить точку трансформации в центр элемента. Для
прямоугольников и кругов удобно использовать bbox():
const box = rect.bbox();
rect.transform({ cx: box.cx, cy: box.cy }).rotate(90);
bbox() возвращает объект с координатами x,
y, width, height, а также
вычисляет центр cx, cy. Это обеспечивает
точное вращение или масштабирование вокруг центра.
В анимациях важно учитывать точку трансформации, чтобы движение выглядело естественным:
rect.transform({ cx: 50, cy: 25 })
.animate(1000)
.rotate(360);
Элемент вращается на 360 градусов вокруг заданной точки, а не смещается по холсту, что делает анимацию стабильной и предсказуемой.
cx и cy для всех
нестандартных трансформаций.bbox().scale, rotate и translate.Правильная установка точки трансформации позволяет создавать сложные, точные и аккуратные анимации в SVG.js, упрощает работу с группами элементов и предотвращает неожиданные смещения.