UNPKG

6.89 kBJavaScriptView Raw
1import { each, isEmpty, isNumber, isNumberEqual, max, min } from '@antv/util';
2// 获取图形的包围盒
3function 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}
26function uniqueValues(array) {
27 return Array.from(new Set(array)).length === 1;
28}
29function mid(array) {
30 return (min(array) + max(array)) / 2;
31}
32/**
33 * @ignore
34 * 根据弧度计算极坐标系下的坐标点
35 * @param centerX
36 * @param centerY
37 * @param radius
38 * @param angleInRadian
39 * @returns
40 */
41export 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 * @ignore
49 * 根据起始角度计算绘制扇形的 path
50 * @param centerX
51 * @param centerY
52 * @param radius
53 * @param startAngleInRadian
54 * @param endAngleInRadian
55 * @returns
56 */
57export 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 * @ignore
96 * Gets arc path
97 * @param centerX
98 * @param centerY
99 * @param radius
100 * @param startAngleInRadian
101 * @param endAngleInRadian
102 * @returns
103 */
104export 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 * @ignore
126 * 从数据模型中的 points 换算角度
127 * @param shapeModel
128 * @param coordinate
129 * @returns
130 */
131export 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 * @ignore
155 * 计算多边形重心: https://en.wikipedia.org/wiki/Centroid#Of_a_polygon
156 */
157export function getPolygonCentroid(xs, ys) {
158 if (isNumber(xs) && isNumber(ys)) {
159 // 普通色块图,xs 和 ys 是数值
160 return [xs, ys];
161 }
162 xs = xs;
163 ys = ys;
164 // 当这个 polygon 的点在一条线上的时候
165 // 也就是说 xs 里面的值都相同,比如:[1, 1, 1, 1]
166 // 或者说 ys 里面的值都相同,比如:[0, 0, 0, 0]
167 // 下面计算得到的 k = 0
168 // 导致返回的值是 [NaN, NaN]
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 * @ignore
191 * 获取需要替换的属性,如果原先图形元素存在,而新图形不存在,则设置 undefined
192 */
193export 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//# sourceMappingURL=graphics.js.map
\No newline at end of file