/** * 3x2鐭╅樀鎿嶄綔绫� * @exports zrender/tool/matrix */ /* global Float32Array */ var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array; /** * Create a identity matrix. * @return {Float32Array|Array.<number>} */ function create() { var out = new ArrayCtor(6); identity(out); return out; } /** * 璁剧疆鐭╅樀涓哄崟浣嶇煩闃� * @param {Float32Array|Array.<number>} out */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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; } /** * Clone a new matrix. * @param {Float32Array|Array.<number>} a */ function clone(a) { var b = create(); copy(b, a); return b; } exports.create = create; exports.identity = identity; exports.copy = copy; exports.mul = mul; exports.translate = translate; exports.rotate = rotate; exports.scale = scale; exports.invert = invert; exports.clone = clone;