UNPKG

@visactor/vchart

Version:

charts lib based @visactor/VGrammar

157 lines (136 loc) 6.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.isValidPoint = exports.getPercentValue = exports.distance = exports.vectorAngle = exports.radiusLabelOrientAttribute = exports.regression = exports.median = exports.standardDeviation = exports.variance = exports.average = exports.sum = exports.max = exports.min = exports.outOfBounds = exports.normalizeStartEndAngle = exports.angleLabelOrientAttribute = exports.normalizeAngle = exports.isLess = exports.isGreater = exports.isClose = void 0; const type_1 = require("./type"), vutils_1 = require("@visactor/vutils"); Object.defineProperty(exports, "isGreater", { enumerable: !0, get: function() { return vutils_1.isGreater; } }), Object.defineProperty(exports, "isLess", { enumerable: !0, get: function() { return vutils_1.isLess; } }), Object.defineProperty(exports, "normalizeAngle", { enumerable: !0, get: function() { return vutils_1.normalizeAngle; } }); const vrender_components_1 = require("@visactor/vrender-components"); function normalizeStartEndAngle(start, end) { let startAngle = 0, endAngle = 2 * Math.PI; const isStartValid = (0, vutils_1.isValid)(start), isEndValid = (0, vutils_1.isValid)(end); for (isStartValid || isEndValid ? isEndValid ? isStartValid ? (startAngle = start, endAngle = end) : (startAngle = end - 2 * Math.PI, endAngle = end) : (startAngle = start, endAngle = start + 2 * Math.PI) : (startAngle = 0, endAngle = 2 * Math.PI); endAngle <= startAngle; ) endAngle += 2 * Math.PI; for (;startAngle > 2 * Math.PI; ) startAngle -= 2 * Math.PI, endAngle -= 2 * Math.PI; for (;endAngle < 0; ) startAngle += 2 * Math.PI, endAngle += 2 * Math.PI; return { startAngle: startAngle, endAngle: endAngle }; } function outOfBounds(bounds, x, y) { return bounds.x1 > x || bounds.x2 < x || bounds.y1 > y || bounds.y2 < y; } function min(data, field) { const dataArray = []; return data.forEach((d => { const value = +d[field]; (0, type_1.isValidNumber)(value) && dataArray.push(value); })), 0 === dataArray.length ? null : (0, vutils_1.minInArray)(dataArray); } function max(data, field) { const dataArray = []; return data.forEach((d => { const value = +d[field]; (0, type_1.isValidNumber)(value) && dataArray.push(value); })), 0 === dataArray.length ? null : (0, vutils_1.maxInArray)(dataArray); } function sum(data, field) { return data.reduce(((pre, _cur) => { const cur = field ? +_cur[field] : +_cur; return (0, type_1.isValidNumber)(cur) && (pre += cur), pre; }), 0); } function average(data, field) { let sum = 0, count = 0; data.forEach((x => { const v = field ? +x[field] : +x; (0, type_1.isValidNumber)(v) && (sum += v, count++); })); return sum / count; } function variance(data, field) { const averageNumber = average(data, field); if (data.length <= 1) return 0; const total = data.reduce(((sum, cur) => sum + (field ? +cur[field] : +cur - averageNumber) ** 2), 0); return total / (data.length - 1); } function standardDeviation(data, field) { return Math.sqrt(variance(data, field)); } function median(data, field) { return (0, vutils_1.median)(data.map((datum => datum[field]))); } function regression(data, fieldX, fieldY) { const {predict: predict} = (0, vutils_1.regressionLinear)(data, (datum => datum[fieldX]), (datum => datum[fieldY])), x1 = min(data, fieldX), x2 = max(data, fieldX), predict1 = predict(x1), predict2 = predict(x2); return [ { [fieldX]: x1, [fieldY]: predict1 }, { [fieldX]: x2, [fieldY]: predict2 } ]; } function radiusLabelOrientAttribute(angle) { let align = "center", baseline = "middle"; return align = (angle = (0, vutils_1.normalizeAngle)(angle)) >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6) ? "right" : angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6) ? "left" : "center", baseline = angle >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3) ? "bottom" : angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3) ? "top" : "middle", { align: align, baseline: baseline }; } function vectorAngle(v1, v2) { const v1Length = distance(v1), v2Length = distance(v2), rho = Math.asin((v1.x * v2.y - v2.x * v1.y) / v1Length / v2Length), theta = Math.acos((v1.x * v2.x + v1.y * v2.y) / v1Length / v2Length); return rho < 0 ? -theta : theta; } function distance(p1, p2 = { x: 0, y: 0 }) { return vutils_1.PointService.distancePP(p1, p2); } function getPercentValue(valueList, precision = 2) { const sum = valueList.reduce(((a, c) => a + (isNaN(c) ? 0 : c)), 0); if (0 === sum) return 0; const digits = Math.pow(10, precision), votesPerQuota = valueList.map((val => (isNaN(val) ? 0 : val) / sum * digits * 100)), targetSeats = 100 * digits, seats = votesPerQuota.map((votes => Math.floor(votes))); let currentSum = seats.reduce(((a, c) => a + c), 0); const remainder = votesPerQuota.map(((votes, idx) => votes - seats[idx])); for (;currentSum < targetSeats; ) { let max = Number.NEGATIVE_INFINITY, maxId = null; for (let i = 0; i < remainder.length; i++) remainder[i] > max && (max = remainder[i], maxId = i); ++seats[maxId], remainder[maxId] = 0, ++currentSum; } return seats.map((entry => entry / digits)); } function isValidPoint(p) { return (0, type_1.isValidNumber)(p.x) && (0, type_1.isValidNumber)(p.y); } Object.defineProperty(exports, "angleLabelOrientAttribute", { enumerable: !0, get: function() { return vrender_components_1.angleLabelOrientAttribute; } }), exports.isClose = vutils_1.isNumberClose, exports.normalizeStartEndAngle = normalizeStartEndAngle, exports.outOfBounds = outOfBounds, exports.min = min, exports.max = max, exports.sum = sum, exports.average = average, exports.variance = variance, exports.standardDeviation = standardDeviation, exports.median = median, exports.regression = regression, exports.radiusLabelOrientAttribute = radiusLabelOrientAttribute, exports.vectorAngle = vectorAngle, exports.distance = distance, exports.getPercentValue = getPercentValue, exports.isValidPoint = isValidPoint; //# sourceMappingURL=math.js.map