UNPKG

@visactor/vchart

Version:

charts lib based @visactor/VGrammar

139 lines (127 loc) 7.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.zeroAlign = exports.getScaleInfo = exports.isValidAlignDomain = void 0; const vutils_1 = require("@visactor/vutils"); function isValidAlignDomain(domain) { return domain.length >= 2 && (0, vutils_1.isValidNumber)(domain[0]) && (0, vutils_1.isValidNumber)((0, vutils_1.last)(domain)) && (0, vutils_1.last)(domain) >= domain[0]; } function getScaleInfo(axis, domain) { var _a; const total = (0, vutils_1.last)(domain) - domain[0], includeZero = (0, vutils_1.last)(domain) * domain[0] < 0; let negative = domain[0] <= 0 ? 0 - domain[0] : 0, positive = (0, vutils_1.last)(domain) > 0 ? (0, vutils_1.last)(domain) - 0 : 0; 0 === total ? domain[0] < 0 ? (negative = 1, positive = 0) : domain[0] > 0 && (negative = 0, positive = 1) : (negative /= total, positive /= total); const domainSpec = axis.getDomainSpec(), result = { total: total, negative: negative, positive: positive, includeZero: includeZero, domain: domain, extendable_min: !(0, vutils_1.isValidNumber)(domainSpec.min), extendable_max: !(0, vutils_1.isValidNumber)(domainSpec.max) }; if (null === (_a = axis._break) || void 0 === _a ? void 0 : _a.scope) { const index = domain.findIndex((value => value >= 0)); let scope, domainTemp; 0 === index ? (scope = axis._break.scope[index], domainTemp = [ domain[0], domain[1] ], result.positive = 1, result.negative = 0) : (0, vutils_1.last)(domain) <= 0 ? (result.positive = 0, result.negative = 1, domainTemp = [ domain[domain.length - 2], domain[domain.length - 1] ]) : (scope = axis._break.scope[index - 1], domainTemp = [ domain[index - 1], domain[index] ], result.negative = scope[0] + (0 - domainTemp[0]) / (domainTemp[1] - domainTemp[0]) * (scope[1] - scope[0]), result.positive = 1 - result.negative), result.break = !0, result.extendable_max = !1, result.extendable_min = !1, result.domain = domainTemp; } return result; } function inDifferentCrossZero(info1, info2) { const {positive: positive1, negative: negative1, extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, extendable_max: s2Extendable_max, domain: domain2} = info2; if (positive2 > 0) { if (!s2Extendable_min) return !1; let comp = negative1 / positive1; s1Extendable_max && (comp = negative1 / Math.max(positive1, positive2), domain1[1] = -domain1[0] / comp), domain2[0] = -domain2[1] * comp; } else if (negative2 > 0) { if (!s2Extendable_max) return !1; let comp = positive1 / negative1; s1Extendable_min && (comp = positive1 / Math.max(negative1, negative1), domain1[0] = -domain1[1] / comp), domain2[1] = -domain2[0] * comp; } return !0; } function inOnlyZeroDomain(info1, info2) { const {extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, domain: domain2} = info2; return (0 !== positive2 || 0 !== negative2) && (!(positive2 > 0 && !s1Extendable_max) && (!(negative2 > 0 && !s1Extendable_min) && (domain1[0] = domain2[0], domain1[1] = domain2[1], !0))); } function inAllCrossZero(info1, info2) { const {positive: positive1, negative: negative1, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, domain: domain2} = info2; if (s1Extendable_max && s2Extendable_min) { const comp = Math.max(negative1, negative2) / Math.max(positive1, positive2); domain1[1] = -domain1[0] / comp, domain2[0] = -domain2[1] * comp; } else if (s2Extendable_min) { const comp = negative1 / positive1; domain2[0] = -domain2[1] * comp; } else { if (!s1Extendable_max) return !1; { const comp = negative2 / positive2; domain1[1] = -domain1[0] / comp; } } return !0; } function inNoCrossDifferentSide(info1, info2) { const {extendable_min: s1Extendable_min, domain: domain1} = info1, {extendable_max: s2Extendable_max, domain: domain2} = info2; return !(!s1Extendable_min || !s2Extendable_max) && (domain1[0] = -domain1[1], domain2[1] = -domain2[0], !0); } exports.isValidAlignDomain = isValidAlignDomain, exports.getScaleInfo = getScaleInfo; const zeroAlign = (targetAxis, currentAxis) => { var _a, _b, _c, _d, _e, _f; const s1 = targetAxis.getScale(), s2 = currentAxis.getScale(); if (!s1 || !s2) return; const domain1 = null !== (_c = null === (_b = (_a = targetAxis).getDomainAfterSpec) || void 0 === _b ? void 0 : _b.call(_a)) && void 0 !== _c ? _c : [ 0, 1 ], domain2 = null !== (_f = null === (_e = (_d = currentAxis).getDomainAfterSpec) || void 0 === _e ? void 0 : _e.call(_d)) && void 0 !== _f ? _f : [ 0, 1 ]; if (!(domain1 && domain2 && isValidAlignDomain(domain1) && isValidAlignDomain(domain2))) return; const info1 = getScaleInfo(targetAxis, domain1), info2 = getScaleInfo(currentAxis, domain2); if (!0 === info1.break && !0 === info2.break) return; const {positive: positive1, negative: negative1, extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, includeZero: includeZero1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, extendable_max: s2Extendable_max, includeZero: includeZero2} = info2; if (0 === positive1 && 0 === negative1) { if (!inOnlyZeroDomain(info1, info2)) return; } else if (0 === positive2 && 0 === negative2) { if (!inOnlyZeroDomain(info2, info1)) return; } else if (includeZero1 || includeZero2) if (includeZero1 && !includeZero2) { if (!inDifferentCrossZero(info1, info2)) return; } else if (includeZero2 && !includeZero1) { if (!inDifferentCrossZero(info2, info1)) return; } else { if (negative1 === negative2) return; if (negative1 > negative2) { if (!inAllCrossZero(info1, info2)) return; } else if (!inAllCrossZero(info2, info1)) return; } else { if (0 === negative1 && 0 === positive2) { if (!inNoCrossDifferentSide(info1, info2)) return; } else if (0 === negative2 && 0 === positive1 && !inNoCrossDifferentSide(info2, info1)) return; if (0 === negative1 && 0 === negative2) if (0 === domain1[0] && domain2[0] > 0) { if (!s2Extendable_min) return; domain2[0] = 0; } else { if (!(0 === domain2[0] && domain1[0] > 0)) return; if (!s1Extendable_min) return; domain1[0] = 0; } if (0 === positive1 && 0 === positive2) if (0 === domain1[1] && domain2[1] > 0) { if (!s2Extendable_max) return; domain2[1] = 0; } else { if (!(0 === domain2[1] && domain1[1] > 0)) return; if (!s1Extendable_max) return; domain1[1] = 0; } } s1.domain(domain1), s2.domain(domain2); }; exports.zeroAlign = zeroAlign; //# sourceMappingURL=zero-align-transform.js.map