UNPKG

5.96 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.sectorPathUpdate = exports.getArcInfo = void 0;
4var tslib_1 = require("tslib");
5var g_canvas_1 = require("@antv/g-canvas");
6var util_1 = require("@antv/util");
7var graphics_1 = require("../../util/graphics");
8function getAngle(startPoint, arcPath) {
9 var _a;
10 var _b = (0, g_canvas_1.getArcParams)(startPoint, arcPath), startAngle = _b.startAngle, endAngle = _b.endAngle;
11 if (!(0, util_1.isNumberEqual)(startAngle, -Math.PI * 0.5) && startAngle < -Math.PI * 0.5) {
12 startAngle += Math.PI * 2;
13 }
14 if (!(0, util_1.isNumberEqual)(endAngle, -Math.PI * 0.5) && endAngle < -Math.PI * 0.5) {
15 endAngle += Math.PI * 2;
16 }
17 if (arcPath[5] === 0) {
18 // 逆时针,需要将 startAngle 和 endAngle 转置,因为 G2 极坐标系为顺时针方向
19 _a = tslib_1.__read([endAngle, startAngle], 2), startAngle = _a[0], endAngle = _a[1];
20 }
21 if ((0, util_1.isNumberEqual)(startAngle, Math.PI * 1.5)) {
22 startAngle = Math.PI * -0.5;
23 }
24 // 当 startAngle, endAngle 接近相等时,不进行 endAngle = Math.PI * 1.5 防止变化从整个圆开始
25 if ((0, util_1.isNumberEqual)(endAngle, Math.PI * -0.5) && !(0, util_1.isNumberEqual)(startAngle, endAngle)) {
26 endAngle = Math.PI * 1.5;
27 }
28 return {
29 startAngle: startAngle,
30 endAngle: endAngle,
31 };
32}
33function getArcStartPoint(path) {
34 var startPoint;
35 if (path[0] === 'M' || path[0] === 'L') {
36 startPoint = [path[1], path[2]];
37 }
38 else if (path[0] === 'a' || path[0] === 'A' || path[0] === 'C') {
39 startPoint = [path[path.length - 2], path[path.length - 1]];
40 }
41 return startPoint;
42}
43/**
44 * path 存在以下情况
45 * 1. 饼图不为整圆的 path,命令为 M, L, A, L, Z
46 * 2. 饼图为整圆的 path,命令为 M, M, A, A, M, Z
47 * 3. 环图不为整圆的 path,命令为 M, A, L, A, L, Z
48 * 4. 环图为整圆的 path,命令为 M, A, A, M, A, A, M, Z
49 * 5. radial-line, 不为整圆时的 path, 命令为 M, A, A, Z
50 * 6. radial-line, 为整圆时的 path,命令为 M, A, A, A, A, Z
51 * @param path theta 坐标系下圆弧的 path 命令
52 */
53function getArcInfo(path) {
54 var _a;
55 var startAngle;
56 var endAngle;
57 var arcPaths = path.filter(function (command) {
58 return command[0] === 'A' || command[0] === 'a';
59 });
60 if (arcPaths.length === 0) {
61 return {
62 startAngle: 0,
63 endAngle: 0,
64 radius: 0,
65 innerRadius: 0,
66 };
67 }
68 var firstArcPathCommand = arcPaths[0];
69 var lastArcPathCommand = arcPaths.length > 1 ? arcPaths[1] : arcPaths[0];
70 var firstIndex = path.indexOf(firstArcPathCommand);
71 var lastIndex = path.indexOf(lastArcPathCommand);
72 var firstStartPoint = getArcStartPoint(path[firstIndex - 1]);
73 var lastStartPoint = getArcStartPoint(path[lastIndex - 1]);
74 var _b = getAngle(firstStartPoint, firstArcPathCommand), firstStartAngle = _b.startAngle, firstEndAngle = _b.endAngle;
75 var _c = getAngle(lastStartPoint, lastArcPathCommand), lastStartAngle = _c.startAngle, lastEndAngle = _c.endAngle;
76 if ((0, util_1.isNumberEqual)(firstStartAngle, lastStartAngle) && (0, util_1.isNumberEqual)(firstEndAngle, lastEndAngle)) {
77 startAngle = firstStartAngle;
78 endAngle = firstEndAngle;
79 }
80 else {
81 startAngle = Math.min(firstStartAngle, lastStartAngle);
82 endAngle = Math.max(firstEndAngle, lastEndAngle);
83 }
84 var radius = firstArcPathCommand[1];
85 var innerRadius = arcPaths[arcPaths.length - 1][1];
86 if (radius < innerRadius) {
87 _a = tslib_1.__read([innerRadius, radius], 2), radius = _a[0], innerRadius = _a[1];
88 }
89 else if (radius === innerRadius) {
90 innerRadius = 0;
91 }
92 return {
93 startAngle: startAngle,
94 endAngle: endAngle,
95 radius: radius,
96 innerRadius: innerRadius,
97 };
98}
99exports.getArcInfo = getArcInfo;
100/**
101 * @ignore
102 * 饼图更新动画
103 * @param shape 文本图形
104 * @param animateCfg
105 * @param cfg
106 */
107function sectorPathUpdate(shape, animateCfg, cfg) {
108 var toAttrs = cfg.toAttrs, coordinate = cfg.coordinate;
109 var path = toAttrs.path || [];
110 var pathCommands = path.map(function (command) { return command[0]; });
111 if (path.length < 1)
112 return;
113 var _a = getArcInfo(path), curStartAngle = _a.startAngle, curEndAngle = _a.endAngle, radius = _a.radius, innerRadius = _a.innerRadius;
114 var _b = getArcInfo(shape.attr('path')), preStartAngle = _b.startAngle, preEndAngle = _b.endAngle;
115 var center = coordinate.getCenter();
116 var diffStartAngle = curStartAngle - preStartAngle;
117 var diffEndAngle = curEndAngle - preEndAngle;
118 // 没有 diff 时直接返回最终 attrs,不需要额外动画
119 if (diffStartAngle === 0 && diffEndAngle === 0) {
120 shape.attr('path', path);
121 return;
122 }
123 shape.animate(function (ratio) {
124 var onFrameStartAngle = preStartAngle + ratio * diffStartAngle;
125 var onFrameEndAngle = preEndAngle + ratio * diffEndAngle;
126 return tslib_1.__assign(tslib_1.__assign({}, toAttrs), { path:
127 // hack, 兼容 /examples/bar/basic/demo/radial-line.ts 动画
128 (0, util_1.isEqual)(pathCommands, ['M', 'A', 'A', 'Z'])
129 ? (0, graphics_1.getArcPath)(center.x, center.y, radius, onFrameStartAngle, onFrameEndAngle)
130 : (0, graphics_1.getSectorPath)(center.x, center.y, radius, onFrameStartAngle, onFrameEndAngle, innerRadius) });
131 }, tslib_1.__assign(tslib_1.__assign({}, animateCfg), { callback: function () {
132 // 将 path 保持原始态,否则会影响 setState() 的动画
133 shape.attr('path', path);
134 (0, util_1.isFunction)(animateCfg.callback) && animateCfg.callback();
135 } }));
136}
137exports.sectorPathUpdate = sectorPathUpdate;
138//# sourceMappingURL=sector-path-update.js.map
\No newline at end of file