UNPKG

@logicflow/extension

Version:
225 lines (224 loc) 7.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDiamondResizeEdgePoint = exports.getEllipseResizeEdgePoint = exports.getRectResizeEdgePoint = exports.ModelType = void 0; var ModelType; (function (ModelType) { ModelType["NODE"] = "node"; ModelType["CIRCLE_NODE"] = "circle-node"; ModelType["POLYGON_NODE"] = "polygon-node"; ModelType["RECT_NODE"] = "rect-node"; ModelType["HTML_NODE"] = "html-node"; ModelType["TEXT_NODE"] = "text-node"; ModelType["ELLIPSE_NODE"] = "ellipse-node"; ModelType["DIAMOND_NODE"] = "diamond-node"; ModelType["EDGE"] = "edge"; ModelType["LINE_EDGE"] = "line-edge"; ModelType["POLYLINE_EDGE"] = "polyline-edge"; ModelType["BEZIER_EDGE"] = "bezier-edge"; ModelType["GRAPH"] = "graph"; })(ModelType || (exports.ModelType = ModelType = {})); // 计算节点的box四角数据 function getNodeBox(node) { var x = node.x, y = node.y, width = node.width, height = node.height; return { minX: x - width / 2, minY: y - height / 2, maxX: x + width / 2, maxY: y + height / 2, }; } // 计算矩形radius设置后,四个圆角的圆心 function getRadiusCenter(node) { var nodeBox = getNodeBox(node); var radius = node.radius; var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY; return [ { x: minX + radius, y: minY + radius, }, { x: maxX - radius, y: minY + radius, }, { x: maxX - radius, y: maxY - radius, }, { x: minX + radius, y: maxY - radius, }, ]; } // 获取矩形resize之后,与矩形连接边的新端点 function getRectResizeEdgePoint(_a) { var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode; var x = point.x, y = point.y; var afterPoint = { x: x, y: y, }; var radius = beforeNode.radius; var beforeNodeBox = getNodeBox(beforeNode); var afterNodeBox = getNodeBox(afterNode); if (x === beforeNodeBox.minX) { // 左边 afterPoint.x = afterNodeBox.minX; var pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius); if (pct) { afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct; } else { afterPoint.y = afterNode.y; } } else if (x === beforeNodeBox.maxX) { // 右边 afterPoint.x = afterNodeBox.maxX; var pct = (y - beforeNode.y) / (beforeNode.height / 2 - radius); if (pct) { afterPoint.y = afterNode.y + (afterNode.height / 2 - radius) * pct; } else { afterPoint.y = afterNode.y; } } else if (y === beforeNodeBox.minY) { // 上边 afterPoint.y = afterNodeBox.minY; var pct = (x - beforeNode.x) / (beforeNode.width / 2 - radius); if (pct) { afterPoint.x = afterNode.x + (afterNode.width / 2 - radius) * pct; } else { afterPoint.x = afterNode.x; } } else if (y === beforeNodeBox.maxY) { // 下边 afterPoint.y = afterNodeBox.maxY; var pct = (x - beforeNode.x) / (beforeNode.width / 2 - radius); if (pct) { afterPoint.x = afterNode.x + (afterNode.width / 2 - radius) * pct; } else { afterPoint.x = afterNode.x; } } else { // 在圆角部分 var beforeCoc = getRadiusCenter(beforeNode); var afterCoc = getRadiusCenter(afterNode); var nodeBox = getNodeBox(beforeNode); var minX = nodeBox.minX, minY = nodeBox.minY, maxX = nodeBox.maxX, maxY = nodeBox.maxY; var index = -1; if (x - minX < radius && y - minY < radius) { // 左上角 index = 0; } else if (maxX - x < radius && y - minY < radius) { // 右上角 index = 1; } else if (maxX - x < radius && maxY - y < radius) { // 右下角 index = 2; } else if (x - minX < radius && minY - y < radius) { // 左下角 index = 3; } if (index > -1) { // 根据夹角角度计算位置 var angle = Math.atan2(y - beforeCoc[index].y, x - beforeCoc[index].x); afterPoint.x = afterCoc[index].x + radius * Math.cos(angle); afterPoint.y = afterCoc[index].y + radius * Math.sin(angle); } } return afterPoint; } exports.getRectResizeEdgePoint = getRectResizeEdgePoint; // 获取椭圆resize之后,与椭圆连接边的新端点 function getEllipseResizeEdgePoint(_a) { var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode; var rx = afterNode.rx, ry = afterNode.ry; var afterPoint = point; // 将椭圆中心当做中心点(0,0),放大缩小前点与X周夹角 var tan = (point.y - beforeNode.y) / (point.x - beforeNode.x); // 方便与公式对照,将rx命名为a,ry命名为b var a = rx; var b = ry; var x; var y; // 将椭圆中心当做中心点(0,0),计算放大缩小后,同一夹角下,点相对位置 if (tan >= Infinity) { // θ = PI / 2 x = 0; y = b; } else if (tan <= -Infinity) { // θ = 3 * PI / 2 x = 0; y = -b; } else if (point.x - beforeNode.x > 0) { // 0 < θ = PI / 2 或者 3 * PI / 2 < θ = 2 * PI // 一四象限 x = (a * b) / Math.sqrt(b * b + a * a * tan * tan); y = (a * b * tan) / Math.sqrt(b * b + a * a * tan * tan); } else { // PI / 2 < θ 3 * PI / 2 // 二三象限 x = -(a * b) / Math.sqrt(b * b + a * a * tan * tan); y = -(a * b * tan) / Math.sqrt(b * b + a * a * tan * tan); } afterPoint = { x: x + afterNode.x, y: y + afterNode.y, }; return afterPoint; } exports.getEllipseResizeEdgePoint = getEllipseResizeEdgePoint; // 获取菱形resize之后,与菱形连接边的新端点 function getDiamondResizeEdgePoint(_a) { var point = _a.point, beforeNode = _a.beforeNode, afterNode = _a.afterNode; var afterPoint = point; var x; var y; var px = point.x - beforeNode.x; var py = point.y - beforeNode.y; var rxBefore = beforeNode.rx; var ryBefore = beforeNode.ry; // eslint-disable-next-line max-len var pct = Math.sqrt((rxBefore - Math.abs(px)) * (rxBefore - Math.abs(px)) + py * py) / Math.sqrt(rxBefore * rxBefore + ryBefore * ryBefore); var rxAfter = afterNode.rx; var ryAfter = afterNode.ry; // eslint-disable-next-line max-len var a = Math.sqrt((rxAfter * rxAfter + ryAfter * ryAfter) * pct * pct * ((rxAfter * rxAfter) / (rxAfter * rxAfter + ryAfter * ryAfter))); var b = a * (ryAfter / rxAfter); if (px >= 0) { // eslint-disable-next-line max-len x = rxAfter - a; } else { x = a - rxAfter; } if (py > 0) { y = b; } else { y = -b; } afterPoint = { x: x + afterNode.x, y: y + afterNode.y, }; return afterPoint; } exports.getDiamondResizeEdgePoint = getDiamondResizeEdgePoint;