| /** |
| * 3x2矩阵操作类 |
| * @exports zrender/tool/matrix |
| */ |
| var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; |
| /** |
| * 创建一个单位矩阵 |
| * @return {Float32Array|Array.<number>} |
| */ |
| |
| export function create() { |
| var out = new ArrayCtor(6); |
| identity(out); |
| return out; |
| } |
| /** |
| * 设置矩阵为单位矩阵 |
| * @param {Float32Array|Array.<number>} out |
| */ |
| |
| export function identity(out) { |
| out[0] = 1; |
| out[1] = 0; |
| out[2] = 0; |
| out[3] = 1; |
| out[4] = 0; |
| out[5] = 0; |
| return out; |
| } |
| /** |
| * 复制矩阵 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} m |
| */ |
| |
| export function copy(out, m) { |
| 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; |
| } |
| /** |
| * 矩阵相乘 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} m1 |
| * @param {Float32Array|Array.<number>} m2 |
| */ |
| |
| export function mul(out, m1, m2) { |
| // Consider matrix.mul(m, m2, m); |
| // where out is the same as m2. |
| // So use temp variable to escape error. |
| var out0 = m1[0] * m2[0] + m1[2] * m2[1]; |
| var out1 = m1[1] * m2[0] + m1[3] * m2[1]; |
| var out2 = m1[0] * m2[2] + m1[2] * m2[3]; |
| var out3 = m1[1] * m2[2] + m1[3] * m2[3]; |
| var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; |
| var 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; |
| } |
| /** |
| * 平移变换 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} a |
| * @param {Float32Array|Array.<number>} v |
| */ |
| |
| export function translate(out, a, v) { |
| 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; |
| } |
| /** |
| * 旋转变换 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} a |
| * @param {number} rad |
| */ |
| |
| export function rotate(out, a, rad) { |
| var aa = a[0]; |
| var ac = a[2]; |
| var atx = a[4]; |
| var ab = a[1]; |
| var ad = a[3]; |
| var aty = a[5]; |
| var st = Math.sin(rad); |
| var 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 + st * aty; |
| out[5] = ct * aty - st * atx; |
| return out; |
| } |
| /** |
| * 缩放变换 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} a |
| * @param {Float32Array|Array.<number>} v |
| */ |
| |
| export function scale(out, a, v) { |
| var vx = v[0]; |
| var 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; |
| } |
| /** |
| * 求逆矩阵 |
| * @param {Float32Array|Array.<number>} out |
| * @param {Float32Array|Array.<number>} a |
| */ |
| |
| export function invert(out, a) { |
| var aa = a[0]; |
| var ac = a[2]; |
| var atx = a[4]; |
| var ab = a[1]; |
| var ad = a[3]; |
| var aty = a[5]; |
| var 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; |
| } |