12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /**
- * @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;
- };
|