@visactor/vrender-components
Version:
components library for dp visualization
77 lines (70 loc) • 4.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.polarAngleAxisDiscreteTicks = exports.getPolarAngleLabelBounds = void 0;
const vutils_1 = require("@visactor/vutils"), util_1 = require("../util"), vutils_2 = require("@visactor/vutils"), text_1 = require("../../../util/text"), util_2 = require("../../util"), getPolarAngleLabelBounds = (scale, domain, op) => {
var _a;
const {labelStyle: labelStyle, getRadius: getRadius, labelOffset: labelOffset, labelFormatter: labelFormatter, inside: inside} = op, radius = null == getRadius ? void 0 : getRadius(), labelAngle = null !== (_a = labelStyle.angle) && void 0 !== _a ? _a : 0, textMeasure = (0,
text_1.initTextMeasure)(labelStyle);
return domain.map((v => {
const str = labelFormatter ? labelFormatter(v) : `${v}`, {width: width, height: height} = textMeasure.quickMeasure(str), textWidth = Math.max(width, util_1.MIN_TICK_GAP), textHeight = Math.max(height, util_1.MIN_TICK_GAP), angle = scale.scale(v), center = {
x: 0,
y: 0
};
let textX = 0, textY = 0;
const orient = {
align: labelStyle.textAlign,
baseline: labelStyle.textBaseline
}, {x: x, y: y} = (0, util_2.getPolarAngleLabelPosition)(angle, center, radius, labelOffset, inside);
orient.align || ((0, vutils_1.isNumberClose)(x, center.x) ? orient.baseline || (orient.baseline = y > center.y ? "top" : "bottom") : x > center.x ? orient.align = "left" : x < center.x && (orient.align = "right")),
textX = x + ("right" === orient.align ? -textWidth : "left" === orient.align ? 0 : -textWidth / 2),
textY = y + ("bottom" === orient.baseline ? -textHeight : "top" === orient.baseline ? 0 : -textHeight / 2);
return (new vutils_2.AABBBounds).set(textX, textY, textX + textWidth, textY + textHeight).rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);
}));
};
exports.getPolarAngleLabelBounds = getPolarAngleLabelBounds;
const polarAngleAxisDiscreteTicks = (scale, op) => {
const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, getRadius: getRadius, labelOffset: labelOffset, labelGap: labelGap = 0, labelStyle: labelStyle} = op, radius = null == getRadius ? void 0 : getRadius();
if (!radius || radius <= 0) return (0, util_1.convertDomainToTickData)(scale.domain());
let scaleTicks;
if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ((0,
vutils_1.isValid)(tickCount)) {
const range = scale.range(), rangeSize = Math.abs(range[range.length - 1] - range[0]), count = (0,
vutils_1.isFunction)(tickCount) ? tickCount({
axisLength: rangeSize,
labelStyle: labelStyle
}) : tickCount;
scaleTicks = scale.ticks(count);
} else if (op.sampling) {
const domain = scale.domain(), range = scale.range(), labelBoundsList = (0, exports.getPolarAngleLabelBounds)(scale, domain, op), rangeStart = (0,
vutils_1.minInArray)(range), rangeEnd = (0, vutils_1.maxInArray)(range), incrementUnit = Math.abs(rangeEnd - rangeStart) * (radius + labelOffset) / domain.length, {step: step, delCount: delCount} = getStep(domain, labelBoundsList, labelGap, Math.floor(labelBoundsList.reduce(((min, curBounds) => Math.min(min, curBounds.width(), curBounds.height())), Number.MAX_VALUE) / incrementUnit));
scaleTicks = scale.stepTicks(step), scaleTicks = scaleTicks.slice(0, scaleTicks.length - delCount);
} else scaleTicks = scale.domain();
return (0, util_1.convertDomainToTickData)(scaleTicks);
};
exports.polarAngleAxisDiscreteTicks = polarAngleAxisDiscreteTicks;
const getStep = (domain, labelBoundsList, labelGap, defaultStep) => {
let step = defaultStep;
do {
let success = !0;
step++;
let ptr = 0;
do {
ptr + step < domain.length && (0, util_1.labelOverlap)(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap) && (success = !1),
ptr += step;
} while (success && ptr < domain.length);
if (success) break;
} while (step <= domain.length);
let delCount = 0;
if (domain.length > 2) {
let ptr = domain.length - domain.length % step;
for (ptr >= domain.length && (ptr -= step); ptr > 0 && (0, util_1.labelOverlap)(labelBoundsList[0], labelBoundsList[ptr]); ) delCount++,
ptr -= step;
}
return {
step: step,
delCount: delCount
};
};
//# sourceMappingURL=polar-angle.js.map