Files
openclaw 0a5f6a8047 Initial commit: Lan-manager project code
- Go backend (server/)
- Frontend (web/, server/static/)
- Database and deployment files
- Scripts and docs

Co-Authored-By: 狸花猫/Claude-Qwen3.6-Plus 🐾
2026-04-20 00:52:58 +08:00

136 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var g_math_1 = require("@antv/g-math");
var path_util_1 = require("@antv/path-util");
var util_1 = require("@antv/util");
var util_2 = require("./util");
function getPathBox(segments, lineWidth) {
var xArr = [];
var yArr = [];
var segmentsWithAngle = [];
for (var i = 0; i < segments.length; i++) {
var segment = segments[i];
var currentPoint = segment.currentPoint, params = segment.params, prePoint = segment.prePoint;
var box = void 0;
switch (segment.command) {
case 'Q':
box = g_math_1.Quad.box(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4]);
break;
case 'C':
box = g_math_1.Cubic.box(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4], params[5], params[6]);
break;
case 'A':
var arcParams = segment.arcParams;
box = g_math_1.Arc.box(arcParams.cx, arcParams.cy, arcParams.rx, arcParams.ry, arcParams.xRotation, arcParams.startAngle, arcParams.endAngle);
break;
default:
xArr.push(currentPoint[0]);
yArr.push(currentPoint[1]);
break;
}
if (box) {
segment.box = box;
xArr.push(box.x, box.x + box.width);
yArr.push(box.y, box.y + box.height);
}
if (lineWidth && (segment.command === 'L' || segment.command === 'M') && segment.prePoint && segment.nextPoint) {
segmentsWithAngle.push(segment);
}
}
// bbox calculation should ignore NaN for path attribute
// ref: https://github.com/antvis/g/issues/210
// ref: https://github.com/antvis/G2/issues/3109
xArr = xArr.filter(function (item) { return !Number.isNaN(item) && item !== Infinity && item !== -Infinity; });
yArr = yArr.filter(function (item) { return !Number.isNaN(item) && item !== Infinity && item !== -Infinity; });
var minX = util_1.min(xArr);
var minY = util_1.min(yArr);
var maxX = util_1.max(xArr);
var maxY = util_1.max(yArr);
if (segmentsWithAngle.length === 0) {
return {
x: minX,
y: minY,
width: maxX - minX,
height: maxY - minY,
};
}
for (var i = 0; i < segmentsWithAngle.length; i++) {
var segment = segmentsWithAngle[i];
var currentPoint = segment.currentPoint;
var extra = void 0;
if (currentPoint[0] === minX) {
extra = getExtraFromSegmentWithAngle(segment, lineWidth);
minX = minX - extra.xExtra;
}
else if (currentPoint[0] === maxX) {
extra = getExtraFromSegmentWithAngle(segment, lineWidth);
maxX = maxX + extra.xExtra;
}
if (currentPoint[1] === minY) {
extra = getExtraFromSegmentWithAngle(segment, lineWidth);
minY = minY - extra.yExtra;
}
else if (currentPoint[1] === maxY) {
extra = getExtraFromSegmentWithAngle(segment, lineWidth);
maxY = maxY + extra.yExtra;
}
}
return {
x: minX,
y: minY,
width: maxX - minX,
height: maxY - minY,
};
}
function getExtraFromSegmentWithAngle(segment, lineWidth) {
var prePoint = segment.prePoint, currentPoint = segment.currentPoint, nextPoint = segment.nextPoint;
var currentAndPre = Math.pow(currentPoint[0] - prePoint[0], 2) + Math.pow(currentPoint[1] - prePoint[1], 2);
var currentAndNext = Math.pow(currentPoint[0] - nextPoint[0], 2) + Math.pow(currentPoint[1] - nextPoint[1], 2);
var preAndNext = Math.pow(prePoint[0] - nextPoint[0], 2) + Math.pow(prePoint[1] - nextPoint[1], 2);
// 以 currentPoint 为顶点的夹角
var currentAngle = Math.acos((currentAndPre + currentAndNext - preAndNext) / (2 * Math.sqrt(currentAndPre) * Math.sqrt(currentAndNext)));
// 夹角为空、 0 或 PI 时,不需要计算夹角处的额外宽度
// 注意: 由于计算精度问题,夹角为 0 的情况计算出来的角度可能是一个很小的值,还需要判断其与 0 是否近似相等
if (!currentAngle || Math.sin(currentAngle) === 0 || util_1.isNumberEqual(currentAngle, 0)) {
return {
xExtra: 0,
yExtra: 0,
};
}
var xAngle = Math.abs(Math.atan2(nextPoint[1] - currentPoint[1], nextPoint[0] - currentPoint[0]));
var yAngle = Math.abs(Math.atan2(nextPoint[0] - currentPoint[0], nextPoint[1] - currentPoint[1]));
// 将夹角转为锐角
xAngle = xAngle > Math.PI / 2 ? Math.PI - xAngle : xAngle;
yAngle = yAngle > Math.PI / 2 ? Math.PI - yAngle : yAngle;
// 这里不考虑在水平和垂直方向的投影,直接使用最大差值
// 由于上层统一加减了二分之一线宽,这里需要进行弥补
var extra = {
// 水平方向投影
xExtra: Math.cos(currentAngle / 2 - xAngle) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - lineWidth / 2 || 0,
// 垂直方向投影
yExtra: Math.cos(yAngle - currentAngle / 2) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - lineWidth / 2 || 0,
};
return extra;
}
function default_1(shape) {
var attrs = shape.attr();
var path = attrs.path, stroke = attrs.stroke;
var lineWidth = stroke ? attrs.lineWidth : 0; // 只有有 stroke 时lineWidth 才生效
var segments = shape.get('segments') || path_util_1.path2Segments(path);
var _a = getPathBox(segments, lineWidth), x = _a.x, y = _a.y, width = _a.width, height = _a.height;
var bbox = {
minX: x,
minY: y,
maxX: x + width,
maxY: y + height,
};
bbox = util_2.mergeArrowBBox(shape, bbox);
return {
x: bbox.minX,
y: bbox.minY,
width: bbox.maxX - bbox.minX,
height: bbox.maxY - bbox.minY,
};
}
exports.default = default_1;
//# sourceMappingURL=path.js.map