1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.sectorPathUpdate = exports.getArcInfo = void 0;
|
4 | var tslib_1 = require("tslib");
|
5 | var g_canvas_1 = require("@antv/g-canvas");
|
6 | var util_1 = require("@antv/util");
|
7 | var graphics_1 = require("../../util/graphics");
|
8 | function 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 |
|
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 |
|
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 | }
|
33 | function 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 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | function 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 | }
|
99 | exports.getArcInfo = getArcInfo;
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 | function 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 |
|
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 |
|
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 |
|
133 | shape.attr('path', path);
|
134 | (0, util_1.isFunction)(animateCfg.callback) && animateCfg.callback();
|
135 | } }));
|
136 | }
|
137 | exports.sectorPathUpdate = sectorPathUpdate;
|
138 |
|
\ | No newline at end of file |