UNPKG

7.37 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.getReplaceAttrs = exports.getPolygonCentroid = exports.getAngle = exports.getArcPath = exports.getSectorPath = exports.polarToCartesian = void 0;
4var util_1 = require("@antv/util");
5// 获取图形的包围盒
6function getPointsBox(points) {
7 if ((0, util_1.isEmpty)(points)) {
8 return null;
9 }
10 var minX = points[0].x;
11 var maxX = points[0].x;
12 var minY = points[0].y;
13 var maxY = points[0].y;
14 (0, util_1.each)(points, function (point) {
15 minX = minX > point.x ? point.x : minX;
16 maxX = maxX < point.x ? point.x : maxX;
17 minY = minY > point.y ? point.y : minY;
18 maxY = maxY < point.y ? point.y : maxY;
19 });
20 return {
21 minX: minX,
22 maxX: maxX,
23 minY: minY,
24 maxY: maxY,
25 centerX: (minX + maxX) / 2,
26 centerY: (minY + maxY) / 2,
27 };
28}
29function uniqueValues(array) {
30 return Array.from(new Set(array)).length === 1;
31}
32function mid(array) {
33 return ((0, util_1.min)(array) + (0, util_1.max)(array)) / 2;
34}
35/**
36 * @ignore
37 * 根据弧度计算极坐标系下的坐标点
38 * @param centerX
39 * @param centerY
40 * @param radius
41 * @param angleInRadian
42 * @returns
43 */
44function polarToCartesian(centerX, centerY, radius, angleInRadian) {
45 return {
46 x: centerX + radius * Math.cos(angleInRadian),
47 y: centerY + radius * Math.sin(angleInRadian),
48 };
49}
50exports.polarToCartesian = polarToCartesian;
51/**
52 * @ignore
53 * 根据起始角度计算绘制扇形的 path
54 * @param centerX
55 * @param centerY
56 * @param radius
57 * @param startAngleInRadian
58 * @param endAngleInRadian
59 * @returns
60 */
61function getSectorPath(centerX, centerY, radius, startAngleInRadian, endAngleInRadian, innerRadius) {
62 if (innerRadius === void 0) { innerRadius = 0; }
63 var start = polarToCartesian(centerX, centerY, radius, startAngleInRadian);
64 var end = polarToCartesian(centerX, centerY, radius, endAngleInRadian);
65 var innerStart = polarToCartesian(centerX, centerY, innerRadius, startAngleInRadian);
66 var innerEnd = polarToCartesian(centerX, centerY, innerRadius, endAngleInRadian);
67 if (endAngleInRadian - startAngleInRadian === Math.PI * 2) {
68 // 整个圆是分割成两个圆
69 var middlePoint = polarToCartesian(centerX, centerY, radius, startAngleInRadian + Math.PI);
70 var innerMiddlePoint = polarToCartesian(centerX, centerY, innerRadius, startAngleInRadian + Math.PI);
71 var circlePathCommands = [
72 ['M', start.x, start.y],
73 ['A', radius, radius, 0, 1, 1, middlePoint.x, middlePoint.y],
74 ['A', radius, radius, 0, 1, 1, end.x, end.y],
75 ['M', innerStart.x, innerStart.y],
76 ];
77 if (innerRadius) {
78 circlePathCommands.push(['A', innerRadius, innerRadius, 0, 1, 0, innerMiddlePoint.x, innerMiddlePoint.y]);
79 circlePathCommands.push(['A', innerRadius, innerRadius, 0, 1, 0, innerEnd.x, innerEnd.y]);
80 }
81 circlePathCommands.push(['M', start.x, start.y]);
82 circlePathCommands.push(['Z']);
83 return circlePathCommands;
84 }
85 var arcSweep = endAngleInRadian - startAngleInRadian <= Math.PI ? 0 : 1;
86 var sectorPathCommands = [
87 ['M', start.x, start.y],
88 ['A', radius, radius, 0, arcSweep, 1, end.x, end.y],
89 ['L', innerEnd.x, innerEnd.y],
90 ];
91 if (innerRadius) {
92 sectorPathCommands.push(['A', innerRadius, innerRadius, 0, arcSweep, 0, innerStart.x, innerStart.y]);
93 }
94 sectorPathCommands.push(['L', start.x, start.y]);
95 sectorPathCommands.push(['Z']);
96 return sectorPathCommands;
97}
98exports.getSectorPath = getSectorPath;
99/**
100 * @ignore
101 * Gets arc path
102 * @param centerX
103 * @param centerY
104 * @param radius
105 * @param startAngleInRadian
106 * @param endAngleInRadian
107 * @returns
108 */
109function getArcPath(centerX, centerY, radius, startAngleInRadian, endAngleInRadian) {
110 var start = polarToCartesian(centerX, centerY, radius, startAngleInRadian);
111 var end = polarToCartesian(centerX, centerY, radius, endAngleInRadian);
112 if ((0, util_1.isNumberEqual)(endAngleInRadian - startAngleInRadian, Math.PI * 2)) {
113 var middlePoint = polarToCartesian(centerX, centerY, radius, startAngleInRadian + Math.PI);
114 return [
115 ['M', start.x, start.y],
116 ['A', radius, radius, 0, 1, 1, middlePoint.x, middlePoint.y],
117 ['A', radius, radius, 0, 1, 1, start.x, start.y],
118 ['A', radius, radius, 0, 1, 0, middlePoint.x, middlePoint.y],
119 ['A', radius, radius, 0, 1, 0, start.x, start.y],
120 ['Z'],
121 ];
122 }
123 var arcSweep = endAngleInRadian - startAngleInRadian <= Math.PI ? 0 : 1;
124 return [
125 ['M', start.x, start.y],
126 ['A', radius, radius, 0, arcSweep, 1, end.x, end.y],
127 ];
128}
129exports.getArcPath = getArcPath;
130/**
131 * @ignore
132 * 从数据模型中的 points 换算角度
133 * @param shapeModel
134 * @param coordinate
135 * @returns
136 */
137function getAngle(shapeModel, coordinate) {
138 var points = shapeModel.points;
139 var box = getPointsBox(points);
140 var endAngle;
141 var startAngle;
142 var coordStartAngle = coordinate.startAngle, coordEndAngle = coordinate.endAngle;
143 var diffAngle = coordEndAngle - coordStartAngle;
144 if (coordinate.isTransposed) {
145 endAngle = box.maxY * diffAngle;
146 startAngle = box.minY * diffAngle;
147 }
148 else {
149 endAngle = box.maxX * diffAngle;
150 startAngle = box.minX * diffAngle;
151 }
152 endAngle += coordStartAngle;
153 startAngle += coordStartAngle;
154 return {
155 startAngle: startAngle,
156 endAngle: endAngle,
157 };
158}
159exports.getAngle = getAngle;
160/**
161 * @ignore
162 * 计算多边形重心: https://en.wikipedia.org/wiki/Centroid#Of_a_polygon
163 */
164function getPolygonCentroid(xs, ys) {
165 if ((0, util_1.isNumber)(xs) && (0, util_1.isNumber)(ys)) {
166 // 普通色块图,xs 和 ys 是数值
167 return [xs, ys];
168 }
169 xs = xs;
170 ys = ys;
171 // 当这个 polygon 的点在一条线上的时候
172 // 也就是说 xs 里面的值都相同,比如:[1, 1, 1, 1]
173 // 或者说 ys 里面的值都相同,比如:[0, 0, 0, 0]
174 // 下面计算得到的 k = 0
175 // 导致返回的值是 [NaN, NaN]
176 // 所以这里做相应的处理
177 if (uniqueValues(xs) || uniqueValues(ys))
178 return [mid(xs), mid(ys)];
179 var i = -1;
180 var x = 0;
181 var y = 0;
182 var former;
183 var current = xs.length - 1;
184 var diff;
185 var k = 0;
186 while (++i < xs.length) {
187 former = current;
188 current = i;
189 k += diff = xs[former] * ys[current] - xs[current] * ys[former];
190 x += (xs[former] + xs[current]) * diff;
191 y += (ys[former] + ys[current]) * diff;
192 }
193 k *= 3;
194 return [x / k, y / k];
195}
196exports.getPolygonCentroid = getPolygonCentroid;
197/**
198 * @ignore
199 * 获取需要替换的属性,如果原先图形元素存在,而新图形不存在,则设置 undefined
200 */
201function getReplaceAttrs(sourceShape, targetShape) {
202 var originAttrs = sourceShape.attr();
203 var newAttrs = targetShape.attr();
204 (0, util_1.each)(originAttrs, function (v, k) {
205 if (newAttrs[k] === undefined) {
206 newAttrs[k] = undefined;
207 }
208 });
209 return newAttrs;
210}
211exports.getReplaceAttrs = getReplaceAttrs;
212//# sourceMappingURL=graphics.js.map
\No newline at end of file