UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

150 lines (149 loc) 5.39 kB
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 };