UNPKG

@visactor/vrender-components

Version:

components library for dp visualization

77 lines (70 loc) 4.66 kB
"use strict"; 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) 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