В библиотеке Two.js класс Two.Matrix
представляет собой фундаментальный инструмент для работы с аффинными
преобразованиями в 2D-пространстве. Он позволяет выполнять
трансформации объектов — смещение, масштабирование,
поворот и наклон — с высокой точностью и эффективностью.
Каждая матрица в Two.js задаётся шестью параметрами: a,
b, c, d, e,
f, которые соответствуют компонентам стандартной 3x3
аффинной матрицы:
[ ]
a, d — масштабирование по осям X и Y.b, c — наклон (skew).e, f — смещение (translation) по осям X и
Y.Этот формат совпадает с синтаксисом CSS и SVG, что упрощает интеграцию с веб-технологиями.
Создать новую матрицу можно через конструктор
Two.Matrix:
let matrix = new Two.Matrix(); // создаёт единичную матрицу
Единичная матрица имеет значения:
a = 1, b = 0, c = 0, d = 1, e = 0, f = 0
Можно сразу задать конкретные значения при создании:
let matrix = new Two.Matrix(2, 0, 0, 2, 100, 50);
Эта матрица масштабирует объект в два раза и смещает его на
(100, 50).
identity()Сбрасывает матрицу к единичной:
matrix.identity();
После вызова все преобразования обнуляются: объект возвращается к исходной позиции и масштабу.
set(a, b, c, d, e, f)Позволяет задать значения матрицы напрямую:
matrix.set(1, 0, 0, 1, 50, 50);
multiply(matrixB)Производит умножение текущей матрицы на другую матрицу
matrixB.
let m1 = new Two.Matrix(1, 0, 0, 1, 10, 20);
let m2 = new Two.Matrix(2, 0, 0, 2, 0, 0);
m1.multiply(m2); // теперь m1 комбинирует оба преобразования
Умножение матриц — ключевой инструмент для композиции трансформаций, например, поворот и смещение одновременно.
inverse()Вычисляет обратную матрицу. Используется для обратных преобразований, когда необходимо вернуться к исходным координатам после применения трансформаций:
let inv = matrix.inverse();
clone()Создаёт полную копию текущей матрицы:
let copy = matrix.clone();
Полезно для сохранения состояния объекта перед выполнением сложных преобразований.
rotate(theta)Поворачивает матрицу на угол theta (в радианах)
относительно начала координат:
matrix.rotate(Math.PI / 4); // поворот на 45 градусов
Внутренне метод использует стандартную формулу поворота:
[ ]
translate(x, y)Смещает матрицу на вектор (x, y):
matrix.translate(100, 50);
Комбинируется с другими трансформациями без потери информации.
scale(sx, sy)Масштабирует матрицу по осям X и Y. Если sy не указан,
используется равный sx:
matrix.scale(2); // увеличивает объект в 2 раза
matrix.scale(1, 0.5); // масштаб X=1, Y=0.5
toString()Возвращает строковое представление матрицы в формате CSS/SVG:
let str = matrix.toString();
// "matrix(a, b, c, d, e, f)"
Это удобно для динамического применения стилей к DOM-элементам или SVG-графике.
Комбинируя методы translate, rotate,
scale и multiply, можно строить
сложные последовательные преобразования. Важный момент
— порядок операций имеет значение:
let m = new Two.Matrix();
m.translate(50, 50);
m.rotate(Math.PI / 2);
m.scale(2, 2);
В этом примере сначала объект сдвигается, затем поворачивается и масштабируется. Если поменять порядок, результат будет отличаться.
Любой объект в Two.js (например, Two.Path,
Two.Rectangle) имеет свойство matrix. Чтобы
применить трансформацию:
let rect = two.makeRectangle(0, 0, 100, 50);
let m = new Two.Matrix();
m.translate(50, 50).rotate(Math.PI / 4);
rect.matrix.multiply(m);
rect._update(); // обновление объекта после изменения матрицы
Метод _update() пересчитывает позиции вершин объекта с
учётом новой матрицы.
Компоненты b и c позволяют реализовать
наклон (skew) объектов:
let skewMatrix = new Two.Matrix(1, Math.tan(Math.PI/6), Math.tan(Math.PI/12), 1, 0, 0);
rect.matrix.multiply(skewMatrix);
rect._update();
Таким образом можно создавать перспективные эффекты и сложные деформации.
multiply вместо ручного вычисления
каждого значения.inverse полезен для обратного
преобразования координат курсора или объектов при сложных
трансформациях.toString() + CSS позволяет интегрировать Two.js
с DOM без потери качества визуализации.translate, rotate
и scale.Two.Matrix обеспечивает полный набор инструментов для:
Эта гибкость делает его центральным элементом для создания динамических, интерактивных и анимированных сцен в Two.js.