UNPKG

4.79 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7// 认为是nice的刻度
8var SNAP_COUNT_ARRAY = [1, 1.2, 1.5, 2, 2.2, 2.4, 2.5, 3, 4, 5, 6, 7.5, 8, 10];
9var DEFAULT_COUNT = 5; // 默认刻度值
10var _default = exports.default = function _default(cfg) {
11 var _a = cfg || {},
12 tickCount = _a.tickCount,
13 tickInterval = _a.tickInterval;
14 var _b = cfg || {},
15 min = _b.min,
16 max = _b.max;
17 min = isNaN(min) ? 0 : min;
18 max = isNaN(max) ? 0 : max;
19 var count = tickCount && tickCount >= 2 ? tickCount : DEFAULT_COUNT;
20 // 计算interval, 优先取tickInterval
21 var interval = tickInterval || getBestInterval({
22 tickCount: count,
23 max: max,
24 min: min
25 });
26 // 通过interval计算最小tick
27 var minTick = Math.floor(min / interval) * interval;
28 // 如果指定了tickInterval, count 需要根据指定的tickInterval来算计
29 if (tickInterval) {
30 var intervalCount = Math.abs(Math.ceil((max - minTick) / tickInterval)) + 1;
31 // tickCount 作为最小 count 处理
32 count = Math.max(count, intervalCount);
33 }
34 var tickLength = 0;
35 var fixedLength = getFixedLength(interval);
36 if (min < 0 && max > 0 && count === 2) {
37 return [toFixed(minTick, fixedLength), toFixed(Math.ceil(max / interval) * interval, fixedLength)];
38 }
39 var ticks = [];
40 while (tickLength < count) {
41 ticks.push(toFixed(minTick + tickLength * interval, fixedLength));
42 tickLength++;
43 }
44 return ticks;
45};
46var DECIMAL_LENGTH = 12;
47function getFactor(number) {
48 // 取正数
49 number = Math.abs(number);
50 var factor = 1;
51 if (number === 0) {
52 return factor;
53 }
54 // 小于1,逐渐放大
55 if (number < 1) {
56 var count = 0;
57 while (number < 1) {
58 factor = factor / 10;
59 number = number * 10;
60 count++;
61 }
62 // 浮点数计算出现问题
63 if (factor.toString().length > DECIMAL_LENGTH) {
64 factor = parseFloat(factor.toFixed(count));
65 }
66 return factor;
67 }
68 // 大于10逐渐缩小
69 while (number > 10) {
70 factor = factor * 10;
71 number = number / 10;
72 }
73 return factor;
74}
75// 获取最佳匹配刻度
76function getBestInterval(_a) {
77 var tickCount = _a.tickCount,
78 min = _a.min,
79 max = _a.max;
80 // 如果最大最小相等,则直接按1处理
81 if (min === max) {
82 return 1 * getFactor(max);
83 }
84 // 1.计算平均刻度间隔
85 var avgInterval = (max - min) / (tickCount - 1);
86 // 2.数据标准归一化 映射到[1-10]区间
87 var factor = getFactor(avgInterval);
88 var calInterval = avgInterval / factor;
89 var calMax = max / factor;
90 var calMin = min / factor;
91 // 根据平均值推算最逼近刻度值
92 var similarityIndex = 0;
93 for (var index = 0; index < SNAP_COUNT_ARRAY.length; index++) {
94 var item = SNAP_COUNT_ARRAY[index];
95 if (calInterval <= item) {
96 similarityIndex = index;
97 break;
98 }
99 }
100 var similarityInterval = min < 0 && max > 0 && tickCount === 2 ? SNAP_COUNT_ARRAY[similarityIndex] : getInterval(similarityIndex, tickCount, calMin, calMax);
101 // 小数点位数还原到数据的位数, 因为similarityIndex有可能是小数,所以需要保留similarityIndex自己的小数位数
102 var fixedLength = getFixedLength(similarityInterval) + getFixedLength(factor);
103 return toFixed(similarityInterval * factor, fixedLength);
104}
105function getInterval(startIndex, tickCount, min, max) {
106 var verify = false;
107 var interval = SNAP_COUNT_ARRAY[startIndex];
108 // 刻度值校验,如果不满足,循环下去
109 for (var i = startIndex; i < SNAP_COUNT_ARRAY.length; i++) {
110 if (intervalIsVerify({
111 interval: SNAP_COUNT_ARRAY[i],
112 tickCount: tickCount,
113 max: max,
114 min: min
115 })) {
116 // 有符合条件的interval
117 interval = SNAP_COUNT_ARRAY[i];
118 verify = true;
119 break;
120 }
121 }
122 // 如果不满足, 依次缩小10倍,再计算
123 if (!verify) {
124 return 10 * getInterval(0, tickCount, min / 10, max / 10);
125 }
126 return interval;
127}
128// 刻度是否满足展示需求
129function intervalIsVerify(_a) {
130 var interval = _a.interval,
131 tickCount = _a.tickCount,
132 max = _a.max,
133 min = _a.min;
134 var minTick = Math.floor(min / interval) * interval;
135 if (minTick + (tickCount - 1) * interval >= max) {
136 return true;
137 }
138 return false;
139}
140// 计算小数点应该保留的位数
141function getFixedLength(num) {
142 var str = num.toString();
143 var index = str.indexOf('.');
144 var indexOfExp = str.indexOf('e-');
145 var length = indexOfExp >= 0 ? parseInt(str.substr(indexOfExp + 2), 10) : str.substr(index + 1).length;
146 if (length > 20) {
147 // 最多保留20位小数
148 length = 20;
149 }
150 return length;
151}
152// @antv/util fixedbase不支持科学计数法的判断,需要提mr
153function toFixed(v, length) {
154 return parseFloat(v.toFixed(length));
155}
\No newline at end of file