UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

75 lines (74 loc) 2.96 kB
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 };