NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/scale/lib/auto/cat.js
2023-09-14 14:47:11 +08:00

88 lines
2.0 KiB
JavaScript

/**
* @fileOverview 计算分类的的坐标点
* @author dxq613@gmail.com
*/
var each = require('@antv/util/lib/each');
var MAX_COUNT = 8;
var SUB_COUNT = 4; // 控制个数不能过小
function getSimpleArray(data) {
var arr = [];
each(data, function (sub) {
arr = arr.concat(sub);
});
return arr;
}
function getGreatestFactor(count, number) {
var i;
for (i = number; i > 0; i--) {
if (count % i === 0) {
break;
}
} // 如果是素数,没有可以整除的数字
if (i === 1) {
for (i = number; i > 0; i--) {
if ((count - 1) % i === 0) {
break;
}
}
}
return i;
}
module.exports = function (info) {
var rst = {};
var ticks = [];
var isRounding = info.isRounding;
var categories = getSimpleArray(info.data);
var length = categories.length;
var maxCount = info.maxCount || MAX_COUNT;
var tickCount;
if (isRounding) {
// 取整操作
tickCount = getGreatestFactor(length - 1, maxCount - 1) + 1; // 如果计算出来只有两个坐标点,则直接使用传入的 maxCount
if (tickCount === 2) {
tickCount = maxCount;
} else if (tickCount < maxCount - SUB_COUNT) {
tickCount = maxCount - SUB_COUNT;
}
} else {
tickCount = maxCount;
}
if (!isRounding && length <= tickCount + tickCount / 2) {
ticks = [].concat(categories);
} else {
var step = parseInt(length / (tickCount - 1), 10);
var groups = categories.map(function (e, i) {
return i % step === 0 ? categories.slice(i, i + step) : null;
}).filter(function (e) {
return e;
});
for (var i = 1, groupLen = groups.length; i < groupLen && (isRounding ? i * step < length - step : i < tickCount - 1); i++) {
ticks.push(groups[i][0]);
}
if (categories.length) {
ticks.unshift(categories[0]);
var last = categories[length - 1];
if (ticks.indexOf(last) === -1) {
ticks.push(last);
}
}
}
rst.categories = categories;
rst.ticks = ticks;
return rst;
};