@omjs/matrix2d
Version:
CSS tranform-2D matrix
1,135 lines (953 loc) • 33.8 kB
JavaScript
/**
* 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 });
})));