295 lines
21 KiB
Java
295 lines
21 KiB
Java
![]() |
"use strict";
|
|||
|
|
|||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
|
|||
|
|
|||
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|||
|
|
|||
|
/**
|
|||
|
* @fileOverview the base class of Coordinate
|
|||
|
* @author sima.zhang
|
|||
|
*/
|
|||
|
var MatrixUtil = require('@antv/util/lib/matrix/');
|
|||
|
|
|||
|
var mix = require('@antv/util/lib/mix');
|
|||
|
|
|||
|
var mat3 = MatrixUtil.mat3;
|
|||
|
var vec3 = MatrixUtil.vec3;
|
|||
|
|
|||
|
var Coord =
|
|||
|
/*#__PURE__*/
|
|||
|
function () {
|
|||
|
_createClass(Coord, [{
|
|||
|
key: "getDefaultCfg",
|
|||
|
|
|||
|
/**
|
|||
|
* 获取默认的配置属性
|
|||
|
* @protected
|
|||
|
* @return {Object} 默认属性
|
|||
|
*/
|
|||
|
value: function getDefaultCfg() {
|
|||
|
return {
|
|||
|
/**
|
|||
|
* Mark x y is transposed.
|
|||
|
* @type {Boolean}
|
|||
|
*/
|
|||
|
isTransposed: false,
|
|||
|
|
|||
|
/**
|
|||
|
* The matrix of coordinate
|
|||
|
* @type {Array}
|
|||
|
*/
|
|||
|
matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1]
|
|||
|
};
|
|||
|
}
|
|||
|
}]);
|
|||
|
|
|||
|
function Coord(cfg) {
|
|||
|
_classCallCheck(this, Coord);
|
|||
|
|
|||
|
var defaultCfg = this.getDefaultCfg();
|
|||
|
mix(this, defaultCfg, cfg);
|
|||
|
this.init();
|
|||
|
}
|
|||
|
|
|||
|
_createClass(Coord, [{
|
|||
|
key: "init",
|
|||
|
value: function init() {
|
|||
|
var start = this.start;
|
|||
|
var end = this.end;
|
|||
|
var center = {
|
|||
|
x: (start.x + end.x) / 2,
|
|||
|
y: (start.y + end.y) / 2
|
|||
|
};
|
|||
|
this.center = center;
|
|||
|
this.width = Math.abs(end.x - start.x);
|
|||
|
this.height = Math.abs(end.y - start.y);
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "_swapDim",
|
|||
|
value: function _swapDim(dim) {
|
|||
|
var dimRange = this[dim];
|
|||
|
|
|||
|
if (dimRange) {
|
|||
|
var tmp = dimRange.start;
|
|||
|
dimRange.start = dimRange.end;
|
|||
|
dimRange.end = tmp;
|
|||
|
}
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "getCenter",
|
|||
|
value: function getCenter() {
|
|||
|
return this.center;
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "getWidth",
|
|||
|
value: function getWidth() {
|
|||
|
return this.width;
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "getHeight",
|
|||
|
value: function getHeight() {
|
|||
|
return this.height;
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "convertDim",
|
|||
|
value: function convertDim(percent, dim) {
|
|||
|
var _this$dim = this[dim],
|
|||
|
start = _this$dim.start,
|
|||
|
end = _this$dim.end;
|
|||
|
return start + percent * (end - start);
|
|||
|
}
|
|||
|
}, {
|
|||
|
key: "invertDim",
|
|||
|
value: function invertDim(value, dim) {
|
|||
|
var _this$dim2 = this[dim],
|
|||
|
start = _this$dim2.start,
|
|||
|
end = _this$dim2.end;
|
|||
|
return (value - start) / (end - start);
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将归一化的坐标点数据转换为画布坐标
|
|||
|
* @override
|
|||
|
* @param {Object} point 归一化的坐标点
|
|||
|
* @return {Object} 返回画布坐标
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "convertPoint",
|
|||
|
value: function convertPoint(point) {
|
|||
|
return point;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将画布坐标转换为归一化的坐标点数据
|
|||
|
* @override
|
|||
|
* @param {Object} point 画布坐标点数据
|
|||
|
* @return {Object} 归一化后的数据点
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "invertPoint",
|
|||
|
value: function invertPoint(point) {
|
|||
|
return point;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将坐标点进行矩阵变换
|
|||
|
* @param {Number} x 对应 x 轴画布坐标
|
|||
|
* @param {Number} y 对应 y 轴画布坐标
|
|||
|
* @param {Number} tag 默认为 0,可取值 0, 1
|
|||
|
* @return {Array} 返回变换后的三阶向量 [x, y, z]
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "applyMatrix",
|
|||
|
value: function applyMatrix(x, y) {
|
|||
|
var tag = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|||
|
var matrix = this.matrix;
|
|||
|
var vector = [x, y, tag];
|
|||
|
vec3.transformMat3(vector, vector, matrix);
|
|||
|
return vector;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将坐标点进行矩阵逆变换
|
|||
|
* @param {Number} x 对应 x 轴画布坐标
|
|||
|
* @param {Number} y 对应 y 轴画布坐标
|
|||
|
* @param {Number} tag 默认为 0,可取值 0, 1
|
|||
|
* @return {Array} 返回矩阵逆变换后的三阶向量 [x, y, z]
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "invertMatrix",
|
|||
|
value: function invertMatrix(x, y) {
|
|||
|
var tag = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|||
|
var matrix = this.matrix;
|
|||
|
var inversedMatrix = mat3.invert([], matrix);
|
|||
|
var vector = [x, y, tag];
|
|||
|
vec3.transformMat3(vector, vector, inversedMatrix);
|
|||
|
return vector;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将归一化的坐标点数据转换为画布坐标,并根据坐标系当前矩阵进行变换
|
|||
|
* @param {Object} point 归一化的坐标点
|
|||
|
* @return {Object} 返回进行矩阵变换后的画布坐标
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "convert",
|
|||
|
value: function convert(point) {
|
|||
|
var _this$convertPoint = this.convertPoint(point),
|
|||
|
x = _this$convertPoint.x,
|
|||
|
y = _this$convertPoint.y;
|
|||
|
|
|||
|
var vector = this.applyMatrix(x, y, 1);
|
|||
|
return {
|
|||
|
x: vector[0],
|
|||
|
y: vector[1]
|
|||
|
};
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将进行过矩阵变换画布坐标转换为归一化坐标
|
|||
|
* @param {Object} point 画布坐标
|
|||
|
* @return {Object} 返回归一化的坐标点
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "invert",
|
|||
|
value: function invert(point) {
|
|||
|
var vector = this.invertMatrix(point.x, point.y, 1);
|
|||
|
return this.invertPoint({
|
|||
|
x: vector[0],
|
|||
|
y: vector[1]
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* 坐标系旋转变换
|
|||
|
* @param {Number} radian 旋转弧度
|
|||
|
* @return {Object} 返回坐标系对象
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "rotate",
|
|||
|
value: function rotate(radian) {
|
|||
|
var matrix = this.matrix;
|
|||
|
var center = this.center;
|
|||
|
mat3.translate(matrix, matrix, [-center.x, -center.y]);
|
|||
|
mat3.rotate(matrix, matrix, radian);
|
|||
|
mat3.translate(matrix, matrix, [center.x, center.y]);
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 坐标系反射变换
|
|||
|
* @param {String} dim 反射维度
|
|||
|
* @return {Object} 返回坐标系对象
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "reflect",
|
|||
|
value: function reflect(dim) {
|
|||
|
switch (dim) {
|
|||
|
case 'x':
|
|||
|
this._swapDim('x');
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case 'y':
|
|||
|
this._swapDim('y');
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
this._swapDim('y');
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 坐标系比例变换
|
|||
|
* @param {Number} s1 x 方向缩放比例
|
|||
|
* @param {Number} s2 y 方向缩放比例
|
|||
|
* @return {Object} 返回坐标系对象
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "scale",
|
|||
|
value: function scale(s1, s2) {
|
|||
|
var matrix = this.matrix;
|
|||
|
var center = this.center;
|
|||
|
mat3.translate(matrix, matrix, [-center.x, -center.y]);
|
|||
|
mat3.scale(matrix, matrix, [s1, s2]);
|
|||
|
mat3.translate(matrix, matrix, [center.x, center.y]);
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 坐标系平移变换
|
|||
|
* @param {Number} x x 方向平移像素
|
|||
|
* @param {Number} y y 方向平移像素
|
|||
|
* @return {Object} 返回坐标系对象
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "translate",
|
|||
|
value: function translate(x, y) {
|
|||
|
var matrix = this.matrix;
|
|||
|
mat3.translate(matrix, matrix, [x, y]);
|
|||
|
return this;
|
|||
|
}
|
|||
|
/**
|
|||
|
* 将坐标系 x y 两个轴进行转置
|
|||
|
* @return {Object} 返回坐标系对象
|
|||
|
*/
|
|||
|
|
|||
|
}, {
|
|||
|
key: "transpose",
|
|||
|
value: function transpose() {
|
|||
|
this.isTransposed = !this.isTransposed;
|
|||
|
return this;
|
|||
|
}
|
|||
|
}]);
|
|||
|
|
|||
|
return Coord;
|
|||
|
}();
|
|||
|
|
|||
|
module.exports = Coord;
|
|||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlLmpzIl0sIm5hbWVzIjpbIk1hdHJpeFV0aWwiLCJyZXF1aXJlIiwibWl4IiwibWF0MyIsInZlYzMiLCJDb29yZCIsImlzVHJhbnNwb3NlZCIsIm1hdHJpeCIsImNmZyIsImRlZmF1bHRDZmciLCJnZXREZWZhdWx0Q2ZnIiwiaW5pdCIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwieCIsInkiLCJ3aWR0aCIsIk1hdGgiLCJhYnMiLCJoZWlnaHQiLCJkaW0iLCJkaW1SYW5nZSIsInRtcCIsInBlcmNlbnQiLCJ2YWx1ZSIsInBvaW50IiwidGFnIiwidmVjdG9yIiwidHJhbnNmb3JtTWF0MyIsImludmVyc2VkTWF0cml4IiwiaW52ZXJ0IiwiY29udmVydFBvaW50IiwiYXBwbHlNYXRyaXgiLCJpbnZlcnRNYXRyaXgiLCJpbnZlcnRQb2ludCIsInJhZGlhbiIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsIl9zd2FwRGltIiwiczEiLCJzMiIsInNjYWxlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztBQUlBLElBQU1BLFVBQVUsR0FBR0MsT0FBTyxDQUFDLHdCQUFELENBQTFCOztBQUNBLElBQU1DLEdBQUcsR0FBR0QsT0FBTyxDQUFDLG9CQUFELENBQW5COztBQUVBLElBQU1FLElBQUksR0FBR0gsVUFBVSxDQUFDRyxJQUF4QjtBQUNBLElBQU1DLElBQUksR0FBR0osVUFBVSxDQUFDSSxJQUF4Qjs7SUFFTUMsSzs7Ozs7O0FBQ0o7Ozs7O29DQUtnQjtBQUNkLGFBQU87QUFDTDs7OztBQUlBQyxRQUFBQSxZQUFZLEVBQUUsS0FMVDs7QUFNTDs7OztBQUlBQyxRQUFBQSxNQUFNLEVBQUUsQ0FBRSxDQUFGLEVBQUssQ0FBTCxFQUFRLENBQVIsRUFBVyxDQUFYLEVBQWMsQ0FBZCxFQUFpQixDQUFqQixFQUFvQixDQUFwQixFQUF1QixDQUF2QixFQUEwQixDQUExQjtBQVZILE9BQVA7QUFZRDs7O0FBRUQsaUJBQVlDLEdBQVosRUFBaUI7QUFBQTs7QUFDZixRQUFNQyxVQUFVLEdBQUcsS0FBS0MsYUFBTCxFQUFuQjtBQUNBUixJQUFBQSxHQUFHLENBQUMsSUFBRCxFQUFPTyxVQUFQLEVBQW1CRCxHQUFuQixDQUFIO0FBQ0EsU0FBS0csSUFBTDtBQUNEOzs7OzJCQUVNO0FBQ0wsVUFBTUMsS0FBSyxHQUFHLEtBQUtBLEtBQW5CO0FBQ0EsVUFBTUMsR0FBRyxHQUFHLEtBQUtBLEdBQWpCO0FBQ0EsVUFBTUMsTUFBTSxHQUFHO0FBQ2JDLFFBQUFBLENBQUMsRUFBRSxDQUFDSCxLQUFLLENBQUNHLENBQU4sR0FBVUYsR0FBRyxDQUFDRSxDQUFmLElBQW9CLENBRFY7QUFFYkMsUUFBQUEsQ0FBQyxFQUFFLENBQUNKLEtBQUssQ0FBQ0ksQ0FBTixHQUFVSCxHQUFHLENBQUNHLENBQWYsSUFBb0I7QUFGVixPQUFmO0FBS0EsV0FBS0YsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsV0FBS0csS0FBTCxHQUFhQyxJQUFJLENBQUNDLEdBQUwsQ0FBU04sR0FBRyxDQUFDRSxDQUFKLEdBQVFILEtBQUssQ0FBQ0csQ0FBdkIsQ0FBYjtBQUNBLFdBQUtLLE1BQUwsR0FBY0YsSUFBSSxDQUFDQyxHQUFMLENBQVNOLEdBQUcsQ0FBQ0csQ0FBSixHQUFRSixLQUFLLENBQUNJLENBQXZCLENBQWQ7QUFDRDs7OzZCQUVRSyxHLEVBQUs7QUFDWixVQUFNQyxRQUFRLEdBQUcsS0FBS0QsR0FBTCxDQUFqQjs7QUFDQSxVQUFJQyxRQUFKLEVBQWM7QUFDWixZQUFNQyxHQUFHLEdBQUdELFFBQVEsQ0FBQ1YsS0FBckI7QUFDQVUsUUFBQUEsUUFBUSxDQUFDVixLQUFULEdBQWlCVSxRQUFRLENBQUNULEdBQTFCO0FBQ0FTLFFBQUFBLFFBQVEsQ0FBQ1QsR0FBVCxHQUFlVSxHQUFmO0FBQ0Q7QUFDRjs7O2dDQUVXO0FBQ1YsYUFBTyxLQUFLVCxNQUFaO0FBQ0Q7OzsrQkFFVTtBQUNULGFBQU8sS0FBS0csS0FBWjtBQUNEOzs7Z0NBRVc7QUFDVixhQUFPLEtBQUtHLE1BQVo7QUFDRDs7OytCQUVVSSxPLEVBQVNILEcsRUFBSztBQUFBLHNCQUNBLEtBQUtBLEdBQUwsQ0FEQTtBQUFBLFVBQ2ZULEtBRGUsYUFDZkEsS0FEZTtBQUFBLFVBQ1JDLEdBRFEsYUFDUkEsR0FEUTtBQUV2QixhQUFPRCxLQUFLLEdBQUdZLE9BQU8sSUFBSVgsR0FBRyxHQUFHRCxLQUFWLENBQXRCO0FBQ0Q7Ozs4QkFFU2EsSyxFQUFPSixHLEVBQUs7QUFBQSx1QkFDRyxLQUFLQSxHQUFMLENBREg7QUFBQSxVQUNaVCxLQURZLGNBQ1pBLEtBRFk7QUFBQSxVQUNMQyxHQURLLGNBQ0xBLEdBREs7QUFFcEIsYUFBTyxDQUFDWSxLQUFLLEdBQUdiLEtBQVQsS0FBbUJDLEdBQUcsR0FBR0QsS0FBekIsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7OztpQ0FNYWMsSyxFQUFPO0FBQ2xCLGFBQU9BLEtBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7Z0NBTVlBLEssRUFBTztBQUNqQixhQUFPQSxLQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7OztnQ0FPWVgsQyxFQUFHQyxDLEVBQVk7QUFBQSxVQUFUVyxHQUFTLHVFQUFILENBQUc7QUFDekIsVUFBTXBCLE1BQU0sR0FBRyxLQUFLQSxNQUFwQjtBQUNBLFVBQU1xQixNQUFNLEdBQUcsQ0FBRWIsQ0FBRixFQUFLQyxDQUFMLEVBQVFXLEdBQVIsQ0FBZjtBQUNBdkIsTUFBQUEsSUFBSSxDQUFDeUIsYUFBTCxDQUFtQkQsTUFBbkIsRUFBMkJBLE1BQTNCLEVBQW1DckIsTUFBbkM7QUFDQSxhQUFPcUIsTUFBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7aUNBT2FiLEMsRUFBR0MsQyxFQUFZO0FBQUEsVUFBVFcsR0FBUyx1RUFBSCxDQUFHO0FBQzFCLFVBQU1wQixNQUFNLEdBQUcsS0FBS0EsTUFBcEI7QUFDQSxVQUFNdUIsY0FBYyxHQUFHM0IsSUFBSSxDQUFDNEIsTUFBTCxDQUFZLEVBQVosRUFBZ0J4QixNQUFoQixDQUF2QjtBQUNBLFVBQU1xQixNQUFNLEdBQUcsQ0FBRWIsQ0FBRixFQUFLQyxDQUFMLEVBQVFXLEdBQVIsQ0FBZjtBQUNBdkIsTUFBQUEsSUFBSSxDQUFDeUIsYUFBTCxDQUFtQkQsTUFBbkIsRUFBMkJBLE1BQTNCLEVBQW1DRSxjQUFuQztBQUNBLGFBQU9GLE1BQVA7QUFDRDtBQUVEOzs7Ozs7Ozs0QkFLUUYsSyxFQUFPO0FBQUEsK0JBQ0ksS0FBS00sWUFBTCxDQUFrQk4sS0FBbEIsQ0FESjtBQUFBLFVBQ0xYLENBREssc0JBQ0xBLENBREs7QUFBQSxVQUNGQyxDQURFLHNCQUNGQSxDQURFOztBQUViLFVBQU1ZLE1BQU0sR0FBRyxLQUFLSyxXQUFMLENBQWlCbEIsQ0FBakIsRUFBb0JDLENBQXBCLEVBQXVCLENBQXZCLENBQWY7QUFDQSx
|