cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
75 lines (74 loc) • 2.96 kB
JavaScript
import { round } from "../util/number.mjs";
import IntervalScale from "../scale/Interval.mjs";
import { getScaleExtent } from "./axisHelper.mjs";
import { increaseInterval } from "../scale/helper.mjs";
var mathLog = Math.log;
function alignScaleTicks(scale, axisModel, alignToScale) {
var intervalScaleProto = IntervalScale.prototype;
var alignToTicks = intervalScaleProto.getTicks.call(alignToScale);
var alignToNicedTicks = intervalScaleProto.getTicks.call(alignToScale, true);
var alignToSplitNumber = alignToTicks.length - 1;
var alignToInterval = intervalScaleProto.getInterval.call(alignToScale);
var scaleExtent = getScaleExtent(scale, axisModel);
var rawExtent = scaleExtent.extent;
var isMinFixed = scaleExtent.fixMin;
var isMaxFixed = scaleExtent.fixMax;
if (scale.type === "log") {
var logBase = mathLog(scale.base);
rawExtent = [mathLog(rawExtent[0]) / logBase, mathLog(rawExtent[1]) / logBase];
}
scale.setExtent(rawExtent[0], rawExtent[1]);
scale.calcNiceExtent({
splitNumber: alignToSplitNumber,
fixMin: isMinFixed,
fixMax: isMaxFixed
});
var extent = intervalScaleProto.getExtent.call(scale);
if (isMinFixed) {
rawExtent[0] = extent[0];
}
if (isMaxFixed) {
rawExtent[1] = extent[1];
}
var interval = intervalScaleProto.getInterval.call(scale);
var min = rawExtent[0];
var max = rawExtent[1];
if (isMinFixed && isMaxFixed) {
interval = (max - min) / alignToSplitNumber;
} else if (isMinFixed) {
max = rawExtent[0] + interval * alignToSplitNumber;
while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])) {
interval = increaseInterval(interval);
max = rawExtent[0] + interval * alignToSplitNumber;
}
} else if (isMaxFixed) {
min = rawExtent[1] - interval * alignToSplitNumber;
while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])) {
interval = increaseInterval(interval);
min = rawExtent[1] - interval * alignToSplitNumber;
}
} else {
var nicedSplitNumber = scale.getTicks().length - 1;
if (nicedSplitNumber > alignToSplitNumber) {
interval = increaseInterval(interval);
}
var range = interval * alignToSplitNumber;
max = Math.ceil(rawExtent[1] / interval) * interval;
min = round(max - range);
if (min < 0 && rawExtent[0] >= 0) {
min = 0;
max = round(range);
} else if (max > 0 && rawExtent[1] <= 0) {
max = 0;
min = -round(range);
}
}
var t0 = (alignToTicks[0].value - alignToNicedTicks[0].value) / alignToInterval;
var t1 = (alignToTicks[alignToSplitNumber].value - alignToNicedTicks[alignToSplitNumber].value) / alignToInterval;
intervalScaleProto.setExtent.call(scale, min + interval * t0, max + interval * t1);
intervalScaleProto.setInterval.call(scale, interval);
if (t0 || t1) {
intervalScaleProto.setNiceExtent.call(scale, min + interval, max - interval);
}
}
export { alignScaleTicks };