@visactor/vrender-components
Version:
components library for dp visualization
102 lines (85 loc) • 4.16 kB
JavaScript
import { isGreater, isLess, tau, normalizeAngle, polarToCartesian, merge, obbSeparation, aabbSeparation } from "@visactor/vutils";
import { traverseGroup } from "../util/common";
import { scale, length } from "../util";
import { DEFAULT_AXIS_BREAK_SYMBOL_STYLE } from "./config";
import { isAngleHorizontal } from "./overlap/util";
export const clampRadian = (angle = 0) => {
if (angle < 0) for (;angle < 0; ) angle += tau; else if (angle > 0) for (;angle > tau; ) angle -= tau;
return angle;
};
export function isInRange(a, min, max) {
return !isLess(a, min, 0, 1e-6) && !isGreater(a, max, 0, 1e-6);
}
export function getCircleLabelPosition(tickPosition, tickVector) {
return {
x: tickPosition.x + tickVector[0],
y: tickPosition.y + tickVector[1]
};
}
export function getAxisBreakSymbolAttrs(props = {}) {
var _a, _b;
const {style: style = {}, angle: angle = .5 * Math.PI} = props, symbolStyle = merge({}, DEFAULT_AXIS_BREAK_SYMBOL_STYLE, style), symbolSize = null !== (_a = symbolStyle.size) && void 0 !== _a ? _a : 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
});
}
export function getElMap(g) {
const elMap = {};
return traverseGroup(g, (el => {
"group" !== el.type && el.id && (elMap[el.id] = el);
})), elMap;
}
export function getVerticalCoord(point, vector) {
return {
x: point.x + vector[0],
y: point.y + vector[1]
};
}
export function getCircleVerticalVector(offset, point, center, inside = !1, axisInside = !1) {
const vector = [ point.x - center.x, point.y - center.y ];
return scale(vector, (inside ? -1 : 1) * (axisInside ? -1 : 1) * offset / length(vector));
}
export function angleLabelOrientAttribute(angle) {
let align = "center", baseline = "middle";
return align = (angle = 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
};
}
export function getPolarAngleLabelPosition(angle, center, radius, labelOffset, inside) {
const point = polarToCartesian({
x: 0,
y: 0
}, radius, angle), labelPoint = getVerticalCoord(point, getCircleVerticalVector(labelOffset, point, center, inside));
return getCircleLabelPosition(labelPoint, getCircleVerticalVector(labelOffset || 1, labelPoint, center, inside));
}
export 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(polarToCartesian(center, radius, angle));
}
return points;
}
export 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;
}
export function textIntersect(textA, textB, sep) {
var _a;
const angle = null === (_a = textA.attribute) || void 0 === _a ? void 0 : _a.angle;
if (isAngleHorizontal(angle, Number.EPSILON)) return sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds);
const a = textA.OBBBounds, b = textB.OBBBounds;
return !a || !b || a.empty() || b.empty() ? sep > aabbSeparation(textA.AABBBounds, textB.AABBBounds) : a.intersects(b) || sep > obbSeparation(a, b);
}
export 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;
}
//# sourceMappingURL=util.js.map