UNPKG

@omjs/matrix2d

Version:

CSS tranform-2D matrix

1,135 lines (953 loc) 33.8 kB
/** * matrix2d 工具包,包含一个Matrix2D类及若干运算方法 * @author oyzhen * @link https://git.coding.net/oyzhen/matrix2d.git */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.matrix2d = {}))); }(this, (function (exports) { 'use strict'; var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var defineProperty = function (obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }; var inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }; var possibleConstructorReturn = function (self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }; var slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var toConsumableArray = function (arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }; var version = "1.2.2"; var _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /** * 可迭代对象(不可变数据结构) * @todo 通过 Proxy 实现如下操作 * let it = new Iterable(1,2,3,4); * it[5] = 1; // return new Iterable(1,2,3,4,5); */ var Iterable = function () { var Iterable = function () { function Iterable() { var _this = this; classCallCheck(this, Iterable); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } args.forEach(function (v, k) { return Object.defineProperty(_this, k, { value: v, enumerable: true }); }); Object.defineProperty(this, 'length', { value: args.length }); } /** * 迭代器 * @returns {Symbol.iterator} */ createClass(Iterable, [{ key: Symbol.iterator, value: function value() { return Array.prototype[Symbol.iterator].call(this); } /** * 值 * @override * @returns {Object} */ }, { key: 'valueOf', value: function valueOf() { return _extends$1({}, this); } /** * 转换为字符串 * @override * @returns {string} */ }, { key: 'toString', value: function toString() { return [].concat(toConsumableArray(this)).join(','); } /** * 自拷贝 * @returns {Iterable} */ }, { key: 'clone', value: function clone() { return new (Function.prototype.bind.apply(Iterable, [null].concat(toConsumableArray(this))))(); } /** * Object.prototype.toString -> [object Iterable] * @override * @returns {string} */ }, { key: 'set', /** * setter -> a new Iterable * @param {number | string} i 下标/索引 * @param {*} v 值 * @returns {Iterable} */ value: function set$$1(i, v) { var temp = [].concat(toConsumableArray(this)); temp[i] = v; return new (Function.prototype.bind.apply(Iterable, [null].concat(toConsumableArray(temp))))(); } /** * getter * @param {number | string} i 下标/索引 */ }, { key: 'get', value: function get$$1(i) { return this[i]; } /** * 判断是否是可迭代对象 * @param {*} iter 待判对象 * @returns {boolean} */ }, { key: Symbol.toStringTag, get: function get$$1() { return 'Iterable'; } }], [{ key: 'isIterable', value: function isIterable(iter) { return iter !== null && iter instanceof Iterable; } }]); return Iterable; }(); /** * 版本号 * @prop {string} version */ Iterable.version = version; return Iterable; }(); /** * Calls a defined callback function on each element of an array, and returns an array that contains the results. * @param callbackfn — A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. * @param thisArg — An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value. */ var map = Array.prototype.map; var version$1 = "1.3.1"; /** * Angle类(不可变对象结构) * 处理角及角单位之间的转换等 * @author oyzhen <https://git.coding.net/oyzhen/angle.git> */ var Angle = function () { /** * Angle 类 */ var Angle = function () { function Angle() { var angle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var unit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Angle.UNIT.RAD; classCallCheck(this, Angle); Object.defineProperties(this, { angle: { value: angle, enumerable: true }, unit: { value: unit, enumerable: true } }); } /** * @override * @returns {string} */ createClass(Angle, [{ key: 'toString', value: function toString() { return this.angle + ' ' + /\(([^)]*)\)/.exec(this.unit.toString())[1]; } /** * 用于JSON.stringify * @override * @returns {string} */ }, { key: 'toJSON', value: function toJSON() { return this.toString(); } /** * @override * @returns {number} */ }, { key: 'valueOf', value: function valueOf() { return this.rad; } /** * Object.prototype.toString -> [object Angle] * @returns {string} */ }, { key: 'clone', /** * 自拷贝 * @returns {Angle} */ value: function clone() { return new Angle(this.angle, this.unit); } /** * 获取弧度值 * @returns {number} */ }, { key: Symbol.toStringTag, get: function get$$1() { return 'Angle'; } }, { key: 'rad', get: function get$$1() { return toRad(this.angle, this.unit); } /** * 获取角度值 * @returns {number} */ }, { key: 'deg', get: function get$$1() { return toDeg(this.angle, this.unit); } /** * 获取梯度值 * @returns {number} */ }, { key: 'grad', get: function get$$1() { return toGrad(this.angle, this.unit); } /** * 获取圈/转数 * @returns {number} */ }, { key: 'turn', get: function get$$1() { return toTurn(this.angle, this.unit); } /** * 判断是否是Angle类型 * @param {*} angle 待判值 */ }], [{ key: 'isAngle', value: function isAngle(angle) { return angle !== null && angle instanceof Angle; } /** * 通过弧度值生成Angle对象 * @param {number} rad 弧度值 * @returns {Angle} */ }, { key: 'fromRad', value: function fromRad() { var rad = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return new Angle(rad, Angle.UNIT.RAD); } /** * 通过角度值生成Angle对象 * @param {number} deg 角度值 * @returns {Angle} */ }, { key: 'fromDeg', value: function fromDeg() { var deg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return new Angle(deg, Angle.UNIT.DEG); } /** * 通过梯度值生成Angle对象 * @param {number} grad 梯度值 * @returns {Angle} */ }, { key: 'fromGrad', value: function fromGrad() { var grad = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return new Angle(grad, Angle.UNIT.GRAD); } /** * 通过圈/转数值生成Angle对象 * @param {number} turn 圈数/转数值 * @returns {Angle} */ }, { key: 'fromTurn', value: function fromTurn() { var turn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return new Angle(turn, Angle.UNIT.TURN); } /** * 通过角描述字符串生成Angle对象 * @param {string} str 角描述字符串, e.g. 90deg * @returns {Angle} */ }, { key: 'fromString', value: function fromString() { var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var sep = /(.*?)(grad|deg|rad|turn)$/.exec(str) || []; var angle = parseFloat(sep[1]) || 0; var unit = Angle.UNIT[(sep[2] || 'rad').toUpperCase()]; return new Angle(angle, unit); } /** * 通过角描述字符串生成Angle对象 * @param {Angle | string} angle Angle实例或角描述字符串, e.g. '90deg' * @returns {Angle} */ }, { key: 'from', value: function from() { var angle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; return Angle.isAngle(angle) ? angle.clone() : Angle.fromString(angle); } }]); return Angle; }(); /** * 角单位 * @prop {Symbol} RAD 弧度 * @prop {Symbol} DEG 角度 * @prop {Symbol} GRAD 梯度 * @prop {Symbol} TURN 圈/转 */ Angle.UNIT = Object.freeze({ RAD: Symbol('rad'), DEG: Symbol('deg'), GRAD: Symbol('grad'), TURN: Symbol('turn') }); /** * 版本号 */ Angle.version = version$1; return Angle; /** * 转换为弧度 * @param {number} angle 角度量值 * @param {Symbol} type 度量单位 */ function toRad(angle, type) { var _Angle$UNIT$RAD$Angle; return angle && angle * (_Angle$UNIT$RAD$Angle = {}, defineProperty(_Angle$UNIT$RAD$Angle, Angle.UNIT.RAD, 1), defineProperty(_Angle$UNIT$RAD$Angle, Angle.UNIT.DEG, Math.PI / 180), defineProperty(_Angle$UNIT$RAD$Angle, Angle.UNIT.GRAD, Math.PI / 200), defineProperty(_Angle$UNIT$RAD$Angle, Angle.UNIT.TURN, 2 * Math.PI), _Angle$UNIT$RAD$Angle)[type] || angle; } /** * 转换为角度 * @param {number} angle 角度量值 * @param {Symbol} type 度量单位 */ function toDeg(angle, type) { var _Angle$UNIT$RAD$Angle2; return angle && angle * (_Angle$UNIT$RAD$Angle2 = {}, defineProperty(_Angle$UNIT$RAD$Angle2, Angle.UNIT.RAD, 180 / Math.PI), defineProperty(_Angle$UNIT$RAD$Angle2, Angle.UNIT.DEG, 1), defineProperty(_Angle$UNIT$RAD$Angle2, Angle.UNIT.GRAD, 0.9), defineProperty(_Angle$UNIT$RAD$Angle2, Angle.UNIT.TURN, 360), _Angle$UNIT$RAD$Angle2)[type] || angle; } /** * 转换为梯度 * @param {number} angle 角度量值 * @param {Symbol} type 度量单位 */ function toGrad(angle, type) { var _Angle$UNIT$RAD$Angle3; return angle && angle * (_Angle$UNIT$RAD$Angle3 = {}, defineProperty(_Angle$UNIT$RAD$Angle3, Angle.UNIT.RAD, 200 / Math.PI), defineProperty(_Angle$UNIT$RAD$Angle3, Angle.UNIT.DEG, 10 / 9), defineProperty(_Angle$UNIT$RAD$Angle3, Angle.UNIT.GRAD, 1), defineProperty(_Angle$UNIT$RAD$Angle3, Angle.UNIT.TURN, 400), _Angle$UNIT$RAD$Angle3)[type] || angle; } /** * 转换为圈/转 * @param {number} angle 角度量值 * @param {Symbol} type 度量单位 */ function toTurn(angle, type) { var _Angle$UNIT$RAD$Angle4; return angle && angle * (_Angle$UNIT$RAD$Angle4 = {}, defineProperty(_Angle$UNIT$RAD$Angle4, Angle.UNIT.RAD, 0.5 / Math.PI), defineProperty(_Angle$UNIT$RAD$Angle4, Angle.UNIT.DEG, 1 / 360), defineProperty(_Angle$UNIT$RAD$Angle4, Angle.UNIT.GRAD, 0.0025), defineProperty(_Angle$UNIT$RAD$Angle4, Angle.UNIT.TURN, 1), _Angle$UNIT$RAD$Angle4)[type] || angle; } }(); /** * matrix2d 工具包,包含一个Matrix2D类及若干运算方法 * @author oyzhen * @link https://git.coding.net/oyzhen/matrix2d.git */ var version$2 = "1.0.1"; /** * 根据指定的小数位四舍五入 * @param {number} digit 小数位数 */ var round = function round(digit) { return function (num, p) { return p = Math.pow(10, digit), Math.round(num * p) / p; }; }; /** * Matrix2D矩阵操作函数 */ /** * 判断是否是类Matrix2D数据结构 * @param {*} mat */ function isMatrix2DLike(mat) { return Matrix2D.isMatrix2D(mat) || Object.keys(mat || {}).join('') === '012345'; } /** * 简化数值,根据指定的小数位数四舍五入 * @param {number} digit 小数位数 */ function simplify() { var digit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3; var m = isMatrix2DLike(this) ? this : new Matrix2D(this); return new Matrix2D(map.call(m, function (v) { return round(digit)(v); })); } /** * 左乘 * @param {Matrix2D} mat1 被乘矩阵 * @param {Matrix2D} mat2 乘矩阵 * @returns {Matrix2D} */ function lmul(mat) { var m1 = isMatrix2DLike(this) ? this : new Matrix2D(this); var m2 = isMatrix2DLike(mat) ? mat : new Matrix2D(mat); return new Matrix2D(m1[0] * m2[0] + m1[1] * m2[2], m1[0] * m2[1] + m1[1] * m2[3], m1[2] * m2[0] + m1[3] * m2[2], m1[2] * m2[1] + m1[3] * m2[3], m1[4] * m2[0] + m1[5] * m2[2] + m2[4], m1[4] * m2[1] + m1[5] * m2[3] + m2[5]); } /** * 右乘 * @param {Matrix2D} mat 被乘矩阵 * @returns {Matrix2D} */ function rmul(mat) { return lmul.call(mat, this); } /** * 乘 * @param {Matrix2D} mat 被乘矩阵 * @returns {Matrix2D} */ function mul(mat) { var dir = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Matrix2D.MUL_DIR.L; if (dir === Matrix2D.MUL_DIR.L) { return lmul.call(this, mat); } return rmul.call(this, mat); } /** * 旋转变换 * @public * @param {Angle | number | string} angle 旋转角,默认 0rad,当传入为数值时单位为deg,当传入为字符串时 * @param {Symbol} dir 旋转方向,默认 顺时针方向 * @returns {Matrix2D} */ function rotate() { var angle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Angle(); var dir = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Matrix2D.ROTATE_DIR.CW; var rad = Angle.from(angle).rad; var cos = Math.cos(rad); var sin = Math.sin(rad); var mat = [cos, sin, -sin, cos, 0, 0]; if (dir === Matrix2D.ROTATE_DIR.ACW) { mat = [cos, -sin, sin, cos, 0, 0]; } return lmul.call(this, mat); } /** * 缩放变换 * @public * @param {number} x x方向缩放量 * @param {number} y y方向缩放量 * @returns {Matrix2D} */ function scale() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; return lmul.call(this, [x, 0, 0, y, 0, 0]); } /** * 倾斜变换 * @public * @param {Angle | string | number} angX x轴倾斜角 * @param {Angle | string | number} angY y轴倾斜角 * @returns {Matrix2D} */ function skew() { var angX = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Angle(); var angY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Angle(); var radX = Angle.from(angX).rad; var radY = Angle.from(angY).rad; return lmul.call(this, [1, Math.tan(radY), Math.tan(radX), 1, 0, 0]); } /** * 平移 * @param {number} x 水平方向平移量 * @param {number} y 垂直方向平移量 * @returns {Matrix2D} */ function translate() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return lmul.call(this, [1, 0, 0, 1, x, y]); } /** * 平移,同translate * @param {number} x 水平方向平移量 * @param {number} y 垂直方向平移量 * @returns {Matrix2D} */ function move() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return translate.call(this, x, y); } /** * 对点应用矩阵变换 * @param {number[]} pt [x, y] 变换点坐标 * @returns {number[]} [x, y] 变换后点坐标 */ function exec() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [], _ref2 = slicedToArray(_ref, 2), _ref2$ = _ref2[0], x = _ref2$ === undefined ? 0 : _ref2$, _ref2$2 = _ref2[1], y = _ref2$2 === undefined ? 0 : _ref2$2; var m = isMatrix2DLike(this) ? this : new Matrix2D(this); return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]]; } /** * 对矩形应用矩阵变换 * @param {Object} rect {x, y, w, h} 矩形描述对象 * @param {number[]} center [cx, cy] 变换中心点 * @returns {Object} {x, y, w, h} 变换后的矩形描述对象 */ function execRect() { var _this = this; var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$x = _ref3.x, x = _ref3$x === undefined ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === undefined ? 0 : _ref3$y, _ref3$w = _ref3.w, w = _ref3$w === undefined ? 0 : _ref3$w, _ref3$h = _ref3.h, h = _ref3$h === undefined ? 0 : _ref3$h; var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [], _ref5 = slicedToArray(_ref4, 2), _ref5$ = _ref5[0], cx = _ref5$ === undefined ? 0 : _ref5$, _ref5$2 = _ref5[1], cy = _ref5$2 === undefined ? 0 : _ref5$2; var bfr = [[x - cx, y - cy], [x + w - cx, y - cy], [x + w - cx, y + h - cy], [x - cx, y + h - cy]]; // 变换前矩形顶点坐标(左上、右上、右下、左下) var aft = bfr.map(function (v) { return exec.call(_this, v); }); var xArr = aft.map(function (v) { return v[0]; }); var yArr = aft.map(function (v) { return v[1]; }); var xMin = Math.min.apply(Math, toConsumableArray(xArr)); var xMax = Math.max.apply(Math, toConsumableArray(xArr)); var yMin = Math.min.apply(Math, toConsumableArray(yArr)); var yMax = Math.max.apply(Math, toConsumableArray(yArr)); return { x: xMin + cx, y: yMin + cy, w: xMax - xMin, h: yMax - yMin }; } /** * 由Matrix2D推导rotate、scale、skew、translate等值 * 先rotate,再scale,再skew,再translate * @todo 已知bug: 当rotate不是90的倍数时,计算值不准确 * @see http://www.wolframalpha.com/input/?i=%7B%7B1,0%7D,%7Bt1,1%7D%7D*%7B%7Bs1,0%7D,%7B0,s2%7D%7D*%7B%7Bcos%5Br%5D,+-sin%5Br%5D%7D,%7Bsin%5Br%5D,+cos%5Br%5D%7D%7D+%3D+%7B%7Bm0,m2%7D,%7Bm1,m3%7D%7D+and+m0*m3!%3Dm1*m2 * @returns {object} {rotate, scale, scaleX, scaleY, skew, skewX, skewY, translate, translateX, translateY} */ function decompose() { var m = isMatrix2DLike(this) ? this : new Matrix2D(this); var dm = m[0] * m[3] - m[1] * m[2]; if (dm === 0) { throw new Error('Only an invertible matrix can be decomposed.'); } var sm = Math.pow(m[0], 2) + Math.pow(m[2], 2); var rotate = Angle.fromRad(2 * Math.atan2(m[0] - Math.sqrt(sm), m[2])); var scaleX = Math.sqrt(sm); var scaleY = dm / scaleX; var skewX = Angle.fromRad(Math.atan2(m[0] * m[1] + m[2] * m[3], sm)); var skewY = Angle.fromRad(0); return { rotate: rotate, scaleX: scaleX, scaleY: scaleY, scale: [scaleX, scaleY], skewX: skewX, skewY: skewY, skew: [skewX, skewY], translateX: m[4], translateY: m[5], translate: [m[4], m[5]] }; } /** * CSS/Affine Transform-2D Matrix * matrix(a, b, c, d, m, n)<br /> * ┌ a c m ┐<br /> * | b d n |<br /> * └ 0 0 1 ┘<br /> */ var Matrix2D = function () { // class definition var Matrix2D = function (_Iterable) { inherits(Matrix2D, _Iterable); /** * 构造函数 * @param {*} mat 矩阵初始化量,可为css transform-2d matrix、数组 * @todo 优化运算 */ function Matrix2D() { classCallCheck(this, Matrix2D); for (var _len = arguments.length, mat = Array(_len), _key = 0; _key < _len; _key++) { mat[_key] = arguments[_key]; } if (Matrix2D.isMatrix2D(mat[0])) { var _ref6; var _this2 = possibleConstructorReturn(this, (_ref6 = Matrix2D.__proto__ || Object.getPrototypeOf(Matrix2D)).call.apply(_ref6, [this].concat(toConsumableArray(mat[0])))); } else { var _mat$toString$split$m = mat.toString().split(/[^\d.\-+e]/).map(function (v) { return parseFloat(v); }).filter(function (x) { return !isNaN(x); }), _mat$toString$split$m2 = slicedToArray(_mat$toString$split$m, 6), _mat$toString$split$m3 = _mat$toString$split$m2[0], a = _mat$toString$split$m3 === undefined ? 1 : _mat$toString$split$m3, _mat$toString$split$m4 = _mat$toString$split$m2[1], b = _mat$toString$split$m4 === undefined ? 0 : _mat$toString$split$m4, _mat$toString$split$m5 = _mat$toString$split$m2[2], c = _mat$toString$split$m5 === undefined ? 0 : _mat$toString$split$m5, _mat$toString$split$m6 = _mat$toString$split$m2[3], d = _mat$toString$split$m6 === undefined ? 1 : _mat$toString$split$m6, _mat$toString$split$m7 = _mat$toString$split$m2[4], tx = _mat$toString$split$m7 === undefined ? 0 : _mat$toString$split$m7, _mat$toString$split$m8 = _mat$toString$split$m2[5], ty = _mat$toString$split$m8 === undefined ? 0 : _mat$toString$split$m8; var _this2 = possibleConstructorReturn(this, (Matrix2D.__proto__ || Object.getPrototypeOf(Matrix2D)).call(this, a, b, c, d, tx, ty)); } var dcache = void 0; Object.defineProperty(_this2, 'decompose', { /** * 矩阵分解,得到rotate/skew/translate/scale等值 * @returns {object} */ get: function get$$1() { if (!dcache) { dcache = decompose.call(_this2); } return dcache; } }); return possibleConstructorReturn(_this2); } /** * 判断是否是Matrix2D对象 * @param {*} mat 待判定对象 */ createClass(Matrix2D, [{ key: 'toString', /** * 转换成字符串 * @override * @returns {string} */ value: function toString() { return 'matrix(' + Array.prototype.join.call(this, ',') + ')'; } /** * JSON.stringify预处理 * @override * @returns {string} */ }, { key: 'toJSON', value: function toJSON() { return this.toString(); } /** * 简化数值,根据指定的小数位数四舍五入 * @param {number} digit * @returns {Matrix2D} */ }, { key: 'toBrief', value: function toBrief(digit) { return simplify.call(this, digit); } /** * @override * @returns {number[]} */ }, { key: 'valueOf', value: function valueOf() { return [].concat(toConsumableArray(this)); } /** * deep clone a copy * @returns {Matrix2D} */ }, { key: 'clone', value: function clone() { return new Matrix2D(this); } /** * 获得旋转量 * @returns {Angle} */ }, { key: 'rotate', get: function get$$1() { return this.decompose.rotate; } /** * 获得缩放量 * @returns {number[]} */ }, { key: 'scale', get: function get$$1() { return this.decompose.scale; } /** * 获得x方向缩放量 * @returns {number} */ }, { key: 'scaleX', get: function get$$1() { return this.decompose.scaleX; } /** * 获得y方向缩放量 * @returns {number} */ }, { key: 'scaleY', get: function get$$1() { return this.decompose.scaleY; } /** * 获得倾斜量 * @returns {Angle[]} */ }, { key: 'skew', get: function get$$1() { return this.decompose.skew; } /** * 获得x方向倾斜量 * @returns {Angle} */ }, { key: 'skewX', get: function get$$1() { return this.decompose.skewX; } /** * 获得y方向倾斜量 * @returns {Angle} */ }, { key: 'skewY', get: function get$$1() { return this.decompose.skewY; } /** * 获得平移量 * @returns {number[]} */ }, { key: 'translate', get: function get$$1() { return this.decompose.translate; } /** * 获得x方向平移量 * @returns {number} */ }, { key: 'translateX', get: function get$$1() { return this.decompose.translateX; } /** * 获得y方向平移量 * @returns {number} */ }, { key: 'translateY', get: function get$$1() { return this.decompose.translateY; } }], [{ key: 'isMatrix2D', value: function isMatrix2D(mat) { return mat != null && mat instanceof Matrix2D; } }]); return Matrix2D; }(Iterable); /** * @prop {string} version 版本号 */ Matrix2D.version = version$2; // Object.defineProperty(Matrix2D, 'version', {value: version}); /** * 矩阵乘法方向 * @readOnly * @static * @property {Symbol} L 左乘 * @property {Symbol} R 右乘 */ Matrix2D.MUL_DIR = Object.freeze({ L: Symbol('left'), R: Symbol('right') }); /** * 旋转方向 * @readOnly * @static * @property {Symbol} CW 顺时针方向 * @property {Symbol} ACW 逆时针方向 */ Matrix2D.ROTATE_DIR = Object.freeze({ CW: Symbol('cw'), ACW: Symbol('acw') }); // CW - 顺时针,ACW - 逆时针 return Matrix2D; }(); exports.Matrix2D = Matrix2D; exports.isMatrix2DLike = isMatrix2DLike; exports.simplify = simplify; exports.lmul = lmul; exports.rmul = rmul; exports.mul = mul; exports.rotate = rotate; exports.scale = scale; exports.skew = skew; exports.translate = translate; exports.move = move; exports.exec = exec; exports.execRect = execRect; exports.decompose = decompose; Object.defineProperty(exports, '__esModule', { value: true }); })));