UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

156 lines (140 loc) 3.27 kB
/** * 3x2矩阵操作类 * @exports zrender/tool/matrix */ /* global Float32Array */ import {VectorArray} from './vector'; export type MatrixArray = number[] /** * Create a identity matrix. */ export function create(): MatrixArray { return [1, 0, 0, 1, 0, 0]; } /** * 设置矩阵为单位矩阵 */ export function identity(out: MatrixArray): MatrixArray { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; return out; } /** * 复制矩阵 */ export function copy(out: MatrixArray, m: MatrixArray): MatrixArray { out[0] = m[0]; out[1] = m[1]; out[2] = m[2]; out[3] = m[3]; out[4] = m[4]; out[5] = m[5]; return out; } /** * 矩阵相乘 */ export function mul(out: MatrixArray, m1: MatrixArray, m2: MatrixArray): MatrixArray { // Consider matrix.mul(m, m2, m); // where out is the same as m2. // So use temp constiable to escape error. const out0 = m1[0] * m2[0] + m1[2] * m2[1]; const out1 = m1[1] * m2[0] + m1[3] * m2[1]; const out2 = m1[0] * m2[2] + m1[2] * m2[3]; const out3 = m1[1] * m2[2] + m1[3] * m2[3]; const out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; const out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = out3; out[4] = out4; out[5] = out5; return out; } /** * 平移变换 */ export function translate(out: MatrixArray, a: MatrixArray, v: VectorArray): MatrixArray { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4] + v[0]; out[5] = a[5] + v[1]; return out; } /** * 旋转变换 */ export function rotate( out: MatrixArray, a: MatrixArray, rad: number, pivot: VectorArray = [0, 0] ): MatrixArray { const aa = a[0]; const ac = a[2]; const atx = a[4]; const ab = a[1]; const ad = a[3]; const aty = a[5]; const st = Math.sin(rad); const ct = Math.cos(rad); out[0] = aa * ct + ab * st; out[1] = -aa * st + ab * ct; out[2] = ac * ct + ad * st; out[3] = -ac * st + ct * ad; out[4] = ct * (atx - pivot[0]) + st * (aty - pivot[1]) + pivot[0]; out[5] = ct * (aty - pivot[1]) - st * (atx - pivot[0]) + pivot[1]; return out; } /** * 缩放变换 */ export function scale(out: MatrixArray, a: MatrixArray, v: VectorArray): MatrixArray { const vx = v[0]; const vy = v[1]; out[0] = a[0] * vx; out[1] = a[1] * vy; out[2] = a[2] * vx; out[3] = a[3] * vy; out[4] = a[4] * vx; out[5] = a[5] * vy; return out; } /** * 求逆矩阵 */ export function invert(out: MatrixArray, a: MatrixArray): MatrixArray | null { const aa = a[0]; const ac = a[2]; const atx = a[4]; const ab = a[1]; const ad = a[3]; const aty = a[5]; let det = aa * ad - ab * ac; if (!det) { return null; } det = 1.0 / det; out[0] = ad * det; out[1] = -ab * det; out[2] = -ac * det; out[3] = aa * det; out[4] = (ac * aty - ad * atx) * det; out[5] = (ab * atx - aa * aty) * det; return out; } /** * Clone a new matrix. */ export function clone(a: MatrixArray): MatrixArray { const b = create(); copy(b, a); return b; }