UNPKG

@visactor/vrender-components

Version:

components library for dp visualization

108 lines (93 loc) 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.hasOverlap = exports.textIntersect = exports.getPolygonPath = exports.getCirclePoints = exports.getPolarAngleLabelPosition = exports.angleLabelOrientAttribute = exports.getCircleVerticalVector = exports.getVerticalCoord = exports.getElMap = exports.getAxisBreakSymbolAttrs = exports.getCircleLabelPosition = exports.isInRange = exports.clampRadian = void 0; const vutils_1 = require("@visactor/vutils"), common_1 = require("../util/common"), util_1 = require("../util"), config_1 = require("./config"), util_2 = require("./overlap/util"), clampRadian = (angle = 0) => { if (angle < 0) for (;angle < 0; ) angle += vutils_1.tau; else if (angle > 0) for (;angle > vutils_1.tau; ) angle -= vutils_1.tau; return angle; }; function isInRange(a, min, max) { return !(0, vutils_1.isLess)(a, min, 0, 1e-6) && !(0, vutils_1.isGreater)(a, max, 0, 1e-6); } function getCircleLabelPosition(tickPosition, tickVector) { return { x: tickPosition.x + tickVector[0], y: tickPosition.y + tickVector[1] }; } function getAxisBreakSymbolAttrs(props = {}) { var _a, _b; const {style: style = {}, angle: angle = .5 * Math.PI} = props, symbolStyle = (0, vutils_1.merge)({}, config_1.DEFAULT_AXIS_BREAK_SYMBOL_STYLE, style), symbolSize = null !== (_a = symbolStyle.size) && void 0 !== _a ? _a : config_1.DEFAULT_AXIS_BREAK_SYMBOL_STYLE.size; return Object.assign(Object.assign({}, symbolStyle), { symbolType: null !== (_b = symbolStyle.symbolType) && void 0 !== _b ? _b : `M ${-symbolSize / 2} ${symbolSize * Math.sin(angle)} L ${symbolSize / 2} ${-symbolSize * Math.sin(angle)}`, symbolSize: symbolSize }); } function getElMap(g) { const elMap = {}; return (0, common_1.traverseGroup)(g, (el => { "group" !== el.type && el.id && (elMap[el.id] = el); })), elMap; } function getVerticalCoord(point, vector) { return { x: point.x + vector[0], y: point.y + vector[1] }; } function getCircleVerticalVector(offset, point, center, inside = !1, axisInside = !1) { const vector = [ point.x - center.x, point.y - center.y ]; return (0, util_1.scale)(vector, (inside ? -1 : 1) * (axisInside ? -1 : 1) * offset / (0, util_1.length)(vector)); } function angleLabelOrientAttribute(angle) { let align = "center", baseline = "middle"; return align = (angle = (0, vutils_1.normalizeAngle)(angle)) >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3) ? "left" : angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3) ? "right" : "center", baseline = angle >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6) ? "bottom" : angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6) ? "top" : "middle", { align: align, baseline: baseline }; } function getPolarAngleLabelPosition(angle, center, radius, labelOffset, inside) { const point = (0, vutils_1.polarToCartesian)({ x: 0, y: 0 }, radius, angle), labelPoint = getVerticalCoord(point, getCircleVerticalVector(labelOffset, point, center, inside)); return getCircleLabelPosition(labelPoint, getCircleVerticalVector(labelOffset || 1, labelPoint, center, inside)); } function getCirclePoints(center, count, radius, startAngle, endAngle) { const points = [], range = endAngle - startAngle; for (let i = 0; i < count; i++) { const angle = startAngle + i * range / count; points.push((0, vutils_1.polarToCartesian)(center, radius, angle)); } return points; } function getPolygonPath(points, closed) { let path = ""; return 0 === points.length || (points.forEach(((point, index) => { 0 === index ? path = `M${point.x},${point.y}` : path += `L${point.x},${point.y}`; })), closed && (path += "Z")), path; } function textIntersect(textA, textB, sep) { var _a; const angle = null === (_a = textA.attribute) || void 0 === _a ? void 0 : _a.angle; if ((0, util_2.isAngleHorizontal)(angle, Number.EPSILON)) return sep > (0, vutils_1.aabbSeparation)(textA.AABBBounds, textB.AABBBounds); const a = textA.OBBBounds, b = textB.OBBBounds; return !a || !b || a.empty() || b.empty() ? sep > (0, vutils_1.aabbSeparation)(textA.AABBBounds, textB.AABBBounds) : a.intersects(b) || sep > (0, vutils_1.obbSeparation)(a, b); } function hasOverlap(items, pad) { for (let b, i = 1, n = items.length, a = items[0]; i < n; a = b, ++i) if (b = items[i], textIntersect(a, b, pad)) return !0; return !1; } exports.clampRadian = clampRadian, exports.isInRange = isInRange, exports.getCircleLabelPosition = getCircleLabelPosition, exports.getAxisBreakSymbolAttrs = getAxisBreakSymbolAttrs, exports.getElMap = getElMap, exports.getVerticalCoord = getVerticalCoord, exports.getCircleVerticalVector = getCircleVerticalVector, exports.angleLabelOrientAttribute = angleLabelOrientAttribute, exports.getPolarAngleLabelPosition = getPolarAngleLabelPosition, exports.getCirclePoints = getCirclePoints, exports.getPolygonPath = getPolygonPath, exports.textIntersect = textIntersect, exports.hasOverlap = hasOverlap; //# sourceMappingURL=util.js.map