NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/component/lib/axis/circle.js
2023-09-14 14:47:11 +08:00

242 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
var Util = require('../util');
var Base = require('./base');
var vec2 = Util.MatrixUtil.vec2;
var Circle = /*#__PURE__*/function (_Base) {
_inheritsLoose(Circle, _Base);
var _super = _createSuper(Circle);
function Circle() {
return _Base.apply(this, arguments) || this;
}
var _proto = Circle.prototype;
_proto.getDefaultCfg = function getDefaultCfg() {
var cfg = _Base.prototype.getDefaultCfg.call(this);
return Util.mix({}, cfg, {
/**
* 坐标轴的类型
* @type {String}
*/
type: 'circle',
/**
* 指定刻度之间的间距
* @type {Number}
*/
tickInterval: null,
/**
* 开始弧度
* @type {Number}
*/
startAngle: -Math.PI / 2,
/**
* 结束弧度
* @type {Number}
*/
endAngle: Math.PI * 3 / 2,
line: {
// @type {Attrs} 坐标轴线的图形属性,如果设置成null则不显示轴线
lineWidth: 1,
stroke: '#C0D0E0'
},
tickLine: {
// @type {Attrs} 标注坐标线的图形属性
lineWidth: 1,
stroke: '#C0D0E0',
length: 5
},
/**
* 默认文本距离轴线的距离
* @type {Number}
*/
_labelOffset: 5
});
};
_proto.parseTick = function parseTick(tick, index, length) {
return {
text: tick,
value: index / length
};
};
_proto._getCirclePoint = function _getCirclePoint(angle, radius) {
var self = this;
var center = self.get('center');
radius = radius || self.get('radius');
return {
x: center.x + Math.cos(angle) * radius,
y: center.y + Math.sin(angle) * radius
};
};
_proto.getTickPoint = function getTickPoint(value) {
var self = this;
var startAngle = self.get('startAngle');
var endAngle = self.get('endAngle');
var angle = startAngle + (endAngle - startAngle) * value;
return self._getCirclePoint(angle);
};
_proto.getSideVector = function getSideVector(offset, point) {
var self = this;
var center = self.get('center');
var vector = [point.x - center.x, point.y - center.y];
if (!Util.isNil(offset)) {
var vecLen = vec2.length(vector);
vec2.scale(vector, vector, offset / vecLen);
}
return vector;
};
_proto.getSidePoint = function getSidePoint(point, offset) {
var self = this;
var vector = self.getSideVector(offset, point);
return {
x: point.x + vector[0],
y: point.y + vector[1]
};
};
_proto.getTickEnd = function getTickEnd(start, length) {
var self = this;
var tickLine = self.get('tickLine');
length = length ? length : tickLine.length;
return self.getSidePoint(start, length);
};
_proto.getTextAnchor = function getTextAnchor(vector) {
var align;
if (Util.snapEqual(vector[0], 0)) {
align = 'center';
} else if (vector[0] > 0) {
align = 'left';
} else if (vector[0] < 0) {
align = 'right';
}
return align;
};
_proto.getLinePath = function getLinePath() {
var self = this;
var center = self.get('center');
var x = center.x;
var y = center.y;
var rx = self.get('radius');
var ry = rx;
var startAngle = self.get('startAngle');
var endAngle = self.get('endAngle');
var inner = self.get('inner');
var path = [];
if (Math.abs(endAngle - startAngle) === Math.PI * 2) {
path = [['M', x, y], ['m', 0, -ry], ['a', rx, ry, 0, 1, 1, 0, 2 * ry], ['a', rx, ry, 0, 1, 1, 0, -2 * ry], ['z']];
} else {
var startPoint = self._getCirclePoint(startAngle);
var endPoint = self._getCirclePoint(endAngle);
var large = Math.abs(endAngle - startAngle) > Math.PI ? 1 : 0;
var sweep = startAngle > endAngle ? 0 : 1;
if (!inner) {
path = [['M', x, y], ['L', startPoint.x, startPoint.y], ['A', rx, ry, 0, large, sweep, endPoint.x, endPoint.y], ['L', x, y]];
} else {
var innerStartVector = self.getSideVector(inner * rx, startPoint);
var innerEndVector = self.getSideVector(inner * rx, endPoint);
var innerStartPoint = {
x: innerStartVector[0] + x,
y: innerStartVector[1] + y
};
var innerEndPoint = {
x: innerEndVector[0] + x,
y: innerEndVector[1] + y
};
path = [['M', innerStartPoint.x, innerStartPoint.y], ['L', startPoint.x, startPoint.y], ['A', rx, ry, 0, large, sweep, endPoint.x, endPoint.y], ['L', innerEndPoint.x, innerEndPoint.y], ['A', rx * inner, ry * inner, 0, large, Math.abs(sweep - 1), innerStartPoint.x, innerStartPoint.y]];
}
}
return path;
};
_proto.addLabel = function addLabel(tick, point, index) {
var self = this;
var offset = self.get('label').offset || self.get('_labelOffset') || 0.001;
point = self.getSidePoint(point, offset);
_Base.prototype.addLabel.call(this, tick, point, index);
};
_proto.autoRotateLabels = function autoRotateLabels() {
var self = this;
var ticks = self.get('ticks');
var labelRenderer = self.get('labelRenderer');
if (labelRenderer && ticks.length > 12) {
// 小于12个文本时文本不旋转
var radius = self.get('radius');
var startAngle = self.get('startAngle');
var endAngle = self.get('endAngle');
var totalAngle = endAngle - startAngle;
var avgAngle = totalAngle / (ticks.length - 1);
var avgWidth = Math.sin(avgAngle / 2) * radius * 2;
var maxLength = self.getMaxLabelWidth(labelRenderer);
Util.each(labelRenderer.get('group').get('children'), function (label, index) {
var tick = ticks[index];
var angle = tick.value * totalAngle + startAngle;
var mode = angle % (Math.PI * 2);
if (maxLength < avgWidth) {
// 文本的最大宽度大于
if (mode <= 0) {
angle = angle + Math.PI;
}
if (mode > Math.PI) {
angle = angle - Math.PI;
}
angle = angle - Math.PI / 2;
label.attr('textAlign', 'center');
} else {
if (mode > Math.PI / 2) {
angle = angle - Math.PI;
} else if (mode < Math.PI / 2 * -1) {
angle = angle + Math.PI;
}
}
label.rotateAtStart(angle);
});
}
};
return Circle;
}(Base);
module.exports = Circle;