linear-tick.js 4.5 KB

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