1 | import { each, isEmpty, isNumber, isNumberEqual, max, min } from '@antv/util';
|
2 |
|
3 | function getPointsBox(points) {
|
4 | if (isEmpty(points)) {
|
5 | return null;
|
6 | }
|
7 | var minX = points[0].x;
|
8 | var maxX = points[0].x;
|
9 | var minY = points[0].y;
|
10 | var maxY = points[0].y;
|
11 | each(points, function (point) {
|
12 | minX = minX > point.x ? point.x : minX;
|
13 | maxX = maxX < point.x ? point.x : maxX;
|
14 | minY = minY > point.y ? point.y : minY;
|
15 | maxY = maxY < point.y ? point.y : maxY;
|
16 | });
|
17 | return {
|
18 | minX: minX,
|
19 | maxX: maxX,
|
20 | minY: minY,
|
21 | maxY: maxY,
|
22 | centerX: (minX + maxX) / 2,
|
23 | centerY: (minY + maxY) / 2,
|
24 | };
|
25 | }
|
26 | function uniqueValues(array) {
|
27 | return Array.from(new Set(array)).length === 1;
|
28 | }
|
29 | function mid(array) {
|
30 | return (min(array) + max(array)) / 2;
|
31 | }
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | export function polarToCartesian(centerX, centerY, radius, angleInRadian) {
|
42 | return {
|
43 | x: centerX + radius * Math.cos(angleInRadian),
|
44 | y: centerY + radius * Math.sin(angleInRadian),
|
45 | };
|
46 | }
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | export function getSectorPath(centerX, centerY, radius, startAngleInRadian, endAngleInRadian, innerRadius) {
|
58 | if (innerRadius === void 0) { innerRadius = 0; }
|
59 | var start = polarToCartesian(centerX, centerY, radius, startAngleInRadian);
|
60 | var end = polarToCartesian(centerX, centerY, radius, endAngleInRadian);
|
61 | var innerStart = polarToCartesian(centerX, centerY, innerRadius, startAngleInRadian);
|
62 | var innerEnd = polarToCartesian(centerX, centerY, innerRadius, endAngleInRadian);
|
63 | if (endAngleInRadian - startAngleInRadian === Math.PI * 2) {
|
64 |
|
65 | var middlePoint = polarToCartesian(centerX, centerY, radius, startAngleInRadian + Math.PI);
|
66 | var innerMiddlePoint = polarToCartesian(centerX, centerY, innerRadius, startAngleInRadian + Math.PI);
|
67 | var circlePathCommands = [
|
68 | ['M', start.x, start.y],
|
69 | ['A', radius, radius, 0, 1, 1, middlePoint.x, middlePoint.y],
|
70 | ['A', radius, radius, 0, 1, 1, end.x, end.y],
|
71 | ['M', innerStart.x, innerStart.y],
|
72 | ];
|
73 | if (innerRadius) {
|
74 | circlePathCommands.push(['A', innerRadius, innerRadius, 0, 1, 0, innerMiddlePoint.x, innerMiddlePoint.y]);
|
75 | circlePathCommands.push(['A', innerRadius, innerRadius, 0, 1, 0, innerEnd.x, innerEnd.y]);
|
76 | }
|
77 | circlePathCommands.push(['M', start.x, start.y]);
|
78 | circlePathCommands.push(['Z']);
|
79 | return circlePathCommands;
|
80 | }
|
81 | var arcSweep = endAngleInRadian - startAngleInRadian <= Math.PI ? 0 : 1;
|
82 | var sectorPathCommands = [
|
83 | ['M', start.x, start.y],
|
84 | ['A', radius, radius, 0, arcSweep, 1, end.x, end.y],
|
85 | ['L', innerEnd.x, innerEnd.y],
|
86 | ];
|
87 | if (innerRadius) {
|
88 | sectorPathCommands.push(['A', innerRadius, innerRadius, 0, arcSweep, 0, innerStart.x, innerStart.y]);
|
89 | }
|
90 | sectorPathCommands.push(['L', start.x, start.y]);
|
91 | sectorPathCommands.push(['Z']);
|
92 | return sectorPathCommands;
|
93 | }
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 | export function getArcPath(centerX, centerY, radius, startAngleInRadian, endAngleInRadian) {
|
105 | var start = polarToCartesian(centerX, centerY, radius, startAngleInRadian);
|
106 | var end = polarToCartesian(centerX, centerY, radius, endAngleInRadian);
|
107 | if (isNumberEqual(endAngleInRadian - startAngleInRadian, Math.PI * 2)) {
|
108 | var middlePoint = polarToCartesian(centerX, centerY, radius, startAngleInRadian + Math.PI);
|
109 | return [
|
110 | ['M', start.x, start.y],
|
111 | ['A', radius, radius, 0, 1, 1, middlePoint.x, middlePoint.y],
|
112 | ['A', radius, radius, 0, 1, 1, start.x, start.y],
|
113 | ['A', radius, radius, 0, 1, 0, middlePoint.x, middlePoint.y],
|
114 | ['A', radius, radius, 0, 1, 0, start.x, start.y],
|
115 | ['Z'],
|
116 | ];
|
117 | }
|
118 | var arcSweep = endAngleInRadian - startAngleInRadian <= Math.PI ? 0 : 1;
|
119 | return [
|
120 | ['M', start.x, start.y],
|
121 | ['A', radius, radius, 0, arcSweep, 1, end.x, end.y],
|
122 | ];
|
123 | }
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 | export function getAngle(shapeModel, coordinate) {
|
132 | var points = shapeModel.points;
|
133 | var box = getPointsBox(points);
|
134 | var endAngle;
|
135 | var startAngle;
|
136 | var coordStartAngle = coordinate.startAngle, coordEndAngle = coordinate.endAngle;
|
137 | var diffAngle = coordEndAngle - coordStartAngle;
|
138 | if (coordinate.isTransposed) {
|
139 | endAngle = box.maxY * diffAngle;
|
140 | startAngle = box.minY * diffAngle;
|
141 | }
|
142 | else {
|
143 | endAngle = box.maxX * diffAngle;
|
144 | startAngle = box.minX * diffAngle;
|
145 | }
|
146 | endAngle += coordStartAngle;
|
147 | startAngle += coordStartAngle;
|
148 | return {
|
149 | startAngle: startAngle,
|
150 | endAngle: endAngle,
|
151 | };
|
152 | }
|
153 |
|
154 |
|
155 |
|
156 |
|
157 | export function getPolygonCentroid(xs, ys) {
|
158 | if (isNumber(xs) && isNumber(ys)) {
|
159 |
|
160 | return [xs, ys];
|
161 | }
|
162 | xs = xs;
|
163 | ys = ys;
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 | if (uniqueValues(xs) || uniqueValues(ys))
|
171 | return [mid(xs), mid(ys)];
|
172 | var i = -1;
|
173 | var x = 0;
|
174 | var y = 0;
|
175 | var former;
|
176 | var current = xs.length - 1;
|
177 | var diff;
|
178 | var k = 0;
|
179 | while (++i < xs.length) {
|
180 | former = current;
|
181 | current = i;
|
182 | k += diff = xs[former] * ys[current] - xs[current] * ys[former];
|
183 | x += (xs[former] + xs[current]) * diff;
|
184 | y += (ys[former] + ys[current]) * diff;
|
185 | }
|
186 | k *= 3;
|
187 | return [x / k, y / k];
|
188 | }
|
189 |
|
190 |
|
191 |
|
192 |
|
193 | export function getReplaceAttrs(sourceShape, targetShape) {
|
194 | var originAttrs = sourceShape.attr();
|
195 | var newAttrs = targetShape.attr();
|
196 | each(originAttrs, function (v, k) {
|
197 | if (newAttrs[k] === undefined) {
|
198 | newAttrs[k] = undefined;
|
199 | }
|
200 | });
|
201 | return newAttrs;
|
202 | }
|
203 |
|
\ | No newline at end of file |