cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
150 lines (149 loc) • 5.39 kB
JavaScript
import { calculateTextPosition } from "../../../zrender/lib/contain/text.mjs";
import { isNumber, isArray } from "../../../zrender/lib/core/util.mjs";
function createSectorCalculateTextPosition(positionMapping, opts) {
opts = opts || {};
var isRoundCap = opts.isRoundCap;
return function(out, opts2, boundingRect) {
var textPosition = opts2.position;
if (!textPosition || textPosition instanceof Array) {
return calculateTextPosition(out, opts2, boundingRect);
}
var mappedSectorPosition = positionMapping(textPosition);
var distance = opts2.distance != null ? opts2.distance : 5;
var sector = this.shape;
var cx = sector.cx;
var cy = sector.cy;
var r = sector.r;
var r0 = sector.r0;
var middleR = (r + r0) / 2;
var startAngle = sector.startAngle;
var endAngle = sector.endAngle;
var middleAngle = (startAngle + endAngle) / 2;
var extraDist = isRoundCap ? Math.abs(r - r0) / 2 : 0;
var mathCos = Math.cos;
var mathSin = Math.sin;
var x = cx + r * mathCos(startAngle);
var y = cy + r * mathSin(startAngle);
var textAlign = "left";
var textVerticalAlign = "top";
switch (mappedSectorPosition) {
case "startArc":
x = cx + (r0 - distance) * mathCos(middleAngle);
y = cy + (r0 - distance) * mathSin(middleAngle);
textAlign = "center";
textVerticalAlign = "top";
break;
case "insideStartArc":
x = cx + (r0 + distance) * mathCos(middleAngle);
y = cy + (r0 + distance) * mathSin(middleAngle);
textAlign = "center";
textVerticalAlign = "bottom";
break;
case "startAngle":
x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, distance + extraDist, false);
y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, distance + extraDist, false);
textAlign = "right";
textVerticalAlign = "middle";
break;
case "insideStartAngle":
x = cx + middleR * mathCos(startAngle) + adjustAngleDistanceX(startAngle, -distance + extraDist, false);
y = cy + middleR * mathSin(startAngle) + adjustAngleDistanceY(startAngle, -distance + extraDist, false);
textAlign = "left";
textVerticalAlign = "middle";
break;
case "middle":
x = cx + middleR * mathCos(middleAngle);
y = cy + middleR * mathSin(middleAngle);
textAlign = "center";
textVerticalAlign = "middle";
break;
case "endArc":
x = cx + (r + distance) * mathCos(middleAngle);
y = cy + (r + distance) * mathSin(middleAngle);
textAlign = "center";
textVerticalAlign = "bottom";
break;
case "insideEndArc":
x = cx + (r - distance) * mathCos(middleAngle);
y = cy + (r - distance) * mathSin(middleAngle);
textAlign = "center";
textVerticalAlign = "top";
break;
case "endAngle":
x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, distance + extraDist, true);
y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, distance + extraDist, true);
textAlign = "left";
textVerticalAlign = "middle";
break;
case "insideEndAngle":
x = cx + middleR * mathCos(endAngle) + adjustAngleDistanceX(endAngle, -distance + extraDist, true);
y = cy + middleR * mathSin(endAngle) + adjustAngleDistanceY(endAngle, -distance + extraDist, true);
textAlign = "right";
textVerticalAlign = "middle";
break;
default:
return calculateTextPosition(out, opts2, boundingRect);
}
out = out || {};
out.x = x;
out.y = y;
out.align = textAlign;
out.verticalAlign = textVerticalAlign;
return out;
};
}
function setSectorTextRotation(sector, textPosition, positionMapping, rotateType) {
if (isNumber(rotateType)) {
sector.setTextConfig({
rotation: rotateType
});
return;
} else if (isArray(textPosition)) {
sector.setTextConfig({
rotation: 0
});
return;
}
var shape = sector.shape;
var startAngle = shape.clockwise ? shape.startAngle : shape.endAngle;
var endAngle = shape.clockwise ? shape.endAngle : shape.startAngle;
var middleAngle = (startAngle + endAngle) / 2;
var anchorAngle;
var mappedSectorPosition = positionMapping(textPosition);
switch (mappedSectorPosition) {
case "startArc":
case "insideStartArc":
case "middle":
case "insideEndArc":
case "endArc":
anchorAngle = middleAngle;
break;
case "startAngle":
case "insideStartAngle":
anchorAngle = startAngle;
break;
case "endAngle":
case "insideEndAngle":
anchorAngle = endAngle;
break;
default:
sector.setTextConfig({
rotation: 0
});
return;
}
var rotate = Math.PI * 1.5 - anchorAngle;
if (mappedSectorPosition === "middle" && rotate > Math.PI / 2 && rotate < Math.PI * 1.5) {
rotate -= Math.PI;
}
sector.setTextConfig({
rotation: rotate
});
}
function adjustAngleDistanceX(angle, distance, isEnd) {
return distance * Math.sin(angle) * (isEnd ? -1 : 1);
}
function adjustAngleDistanceY(angle, distance, isEnd) {
return distance * Math.cos(angle) * (isEnd ? 1 : -1);
}
export { createSectorCalculateTextPosition, setSectorTextRotation };