185 lines
5.9 KiB
Java
185 lines
5.9 KiB
Java
![]() |
import { __assign, __extends } from "tslib";
|
||
|
import { each, isArray } from '@antv/util';
|
||
|
import { getDistanceToCenter } from '../../util/coordinate';
|
||
|
import { getAngleByPoint } from '../../util/coordinate';
|
||
|
import GeometryLabel from './base';
|
||
|
var HALF_PI = Math.PI / 2;
|
||
|
/**
|
||
|
* 极坐标下的图形 label
|
||
|
*/
|
||
|
var PolarLabel = /** @class */ (function (_super) {
|
||
|
__extends(PolarLabel, _super);
|
||
|
function PolarLabel() {
|
||
|
return _super !== null && _super.apply(this, arguments) || this;
|
||
|
}
|
||
|
/**
|
||
|
* @override
|
||
|
* 获取文本的对齐方式
|
||
|
* @param point
|
||
|
*/
|
||
|
PolarLabel.prototype.getLabelAlign = function (point) {
|
||
|
var coordinate = this.getCoordinate();
|
||
|
var align;
|
||
|
if (point.labelEmit) {
|
||
|
align = (point.angle <= Math.PI / 2 && point.angle >= -Math.PI / 2) ? 'left' : 'right';
|
||
|
}
|
||
|
else if (!coordinate.isTransposed) {
|
||
|
align = 'center';
|
||
|
}
|
||
|
else {
|
||
|
var center = coordinate.getCenter();
|
||
|
var offset = this.getDefaultOffset(point.offset);
|
||
|
if (Math.abs(point.x - center.x) < 1) {
|
||
|
align = 'center';
|
||
|
}
|
||
|
else if (point.angle > Math.PI || point.angle <= 0) {
|
||
|
align = offset > 0 ? 'left' : 'right';
|
||
|
}
|
||
|
else {
|
||
|
align = offset > 0 ? 'right' : 'left';
|
||
|
}
|
||
|
}
|
||
|
return align;
|
||
|
};
|
||
|
/**
|
||
|
* @override
|
||
|
* 获取 label 的位置
|
||
|
* @param labelCfg
|
||
|
* @param mappingData
|
||
|
* @param index
|
||
|
*/
|
||
|
PolarLabel.prototype.getLabelPoint = function (labelCfg, mappingData, index) {
|
||
|
var factor = 1;
|
||
|
var arcPoint;
|
||
|
var content = labelCfg.content[index];
|
||
|
if (this.isToMiddle(mappingData)) {
|
||
|
arcPoint = this.getMiddlePoint(mappingData.points);
|
||
|
}
|
||
|
else {
|
||
|
if (labelCfg.content.length === 1 && index === 0) {
|
||
|
index = 1;
|
||
|
}
|
||
|
else if (index === 0) {
|
||
|
factor = -1;
|
||
|
}
|
||
|
arcPoint = this.getArcPoint(mappingData, index);
|
||
|
}
|
||
|
var offset = this.getDefaultOffset(labelCfg.offset) * factor;
|
||
|
var middleAngle = this.getPointAngle(arcPoint);
|
||
|
var isLabelEmit = labelCfg.labelEmit;
|
||
|
var labelPositionCfg = this.getCirclePoint(middleAngle, offset, arcPoint, isLabelEmit);
|
||
|
if (labelPositionCfg.r === 0) {
|
||
|
// 如果文本位置位于圆心,则不展示
|
||
|
labelPositionCfg.content = '';
|
||
|
}
|
||
|
else {
|
||
|
labelPositionCfg.content = content;
|
||
|
labelPositionCfg.angle = middleAngle;
|
||
|
labelPositionCfg.color = mappingData.color;
|
||
|
}
|
||
|
labelPositionCfg.rotate = labelCfg.autoRotate
|
||
|
? this.getLabelRotate(middleAngle, offset, isLabelEmit)
|
||
|
: labelCfg.rotate;
|
||
|
labelPositionCfg.start = {
|
||
|
x: arcPoint.x,
|
||
|
y: arcPoint.y,
|
||
|
};
|
||
|
return labelPositionCfg;
|
||
|
};
|
||
|
/**
|
||
|
* 获取圆弧的位置
|
||
|
*/
|
||
|
PolarLabel.prototype.getArcPoint = function (mappingData, index) {
|
||
|
if (index === void 0) { index = 0; }
|
||
|
if (!isArray(mappingData.x) && !isArray(mappingData.y)) {
|
||
|
return {
|
||
|
x: mappingData.x,
|
||
|
y: mappingData.y,
|
||
|
};
|
||
|
}
|
||
|
return {
|
||
|
x: isArray(mappingData.x) ? mappingData.x[index] : mappingData.x,
|
||
|
y: isArray(mappingData.y) ? mappingData.y[index] : mappingData.y,
|
||
|
};
|
||
|
};
|
||
|
/**
|
||
|
* 计算坐标线点在极坐标系下角度
|
||
|
* @param point
|
||
|
*/
|
||
|
PolarLabel.prototype.getPointAngle = function (point) {
|
||
|
return getAngleByPoint(this.getCoordinate(), point);
|
||
|
};
|
||
|
/**
|
||
|
* 获取坐标点与圆心形成的圆的位置信息
|
||
|
* @param angle
|
||
|
* @param offset
|
||
|
* @param point
|
||
|
* @param isLabelEmit
|
||
|
*/
|
||
|
PolarLabel.prototype.getCirclePoint = function (angle, offset, point, isLabelEmit) {
|
||
|
var coordinate = this.getCoordinate();
|
||
|
var center = coordinate.getCenter();
|
||
|
var r = getDistanceToCenter(coordinate, point);
|
||
|
if (r === 0) {
|
||
|
return __assign(__assign({}, center), { r: r });
|
||
|
}
|
||
|
var labelAngle = angle;
|
||
|
if (coordinate.isTransposed && r > offset && !isLabelEmit) {
|
||
|
var appendAngle = Math.asin(offset / (2 * r));
|
||
|
labelAngle = angle + appendAngle * 2;
|
||
|
}
|
||
|
else {
|
||
|
r = r + offset;
|
||
|
}
|
||
|
return {
|
||
|
x: center.x + r * Math.cos(labelAngle),
|
||
|
y: center.y + r * Math.sin(labelAngle),
|
||
|
r: r,
|
||
|
};
|
||
|
};
|
||
|
/**
|
||
|
* 获取 label 的旋转角度
|
||
|
* @param angle
|
||
|
* @param offset
|
||
|
* @param isLabelEmit
|
||
|
*/
|
||
|
PolarLabel.prototype.getLabelRotate = function (angle, offset, isLabelEmit) {
|
||
|
var rotate = angle + HALF_PI;
|
||
|
if (isLabelEmit) {
|
||
|
rotate -= HALF_PI;
|
||
|
}
|
||
|
if (rotate) {
|
||
|
if (rotate > HALF_PI) {
|
||
|
rotate = rotate - Math.PI;
|
||
|
}
|
||
|
else if (rotate < -HALF_PI) {
|
||
|
rotate = rotate + Math.PI;
|
||
|
}
|
||
|
}
|
||
|
return rotate;
|
||
|
};
|
||
|
// 获取中心的位置
|
||
|
PolarLabel.prototype.getMiddlePoint = function (points) {
|
||
|
var coordinate = this.getCoordinate();
|
||
|
var count = points.length;
|
||
|
var middlePoint = {
|
||
|
x: 0,
|
||
|
y: 0,
|
||
|
};
|
||
|
each(points, function (point) {
|
||
|
middlePoint.x += point.x;
|
||
|
middlePoint.y += point.y;
|
||
|
});
|
||
|
middlePoint.x /= count;
|
||
|
middlePoint.y /= count;
|
||
|
middlePoint = coordinate.convert(middlePoint);
|
||
|
return middlePoint;
|
||
|
};
|
||
|
// 是否居中
|
||
|
PolarLabel.prototype.isToMiddle = function (mappingData) {
|
||
|
return mappingData.x.length > 2;
|
||
|
};
|
||
|
return PolarLabel;
|
||
|
}(GeometryLabel));
|
||
|
export default PolarLabel;
|
||
|
//# sourceMappingURL=polar.js.map
|