UNPKG

@logicflow/core

Version:

LogicFlow, help you quickly create flowcharts

73 lines (72 loc) 3.01 kB
// 各类算法的实现 export * from './outline'; export * from './edge'; /* * 计算垂直边的与起始点有一定距离对称,边垂直于边的点 * 调用方:计算箭头位置,计算扩大变得点击区域 */ export var getVerticalPointOfLine = function (config) { /* ** offset: 端点到垂直点的距离 ** verticalLength: 两边点到垂直点的距离 ** type: 标识求的是线段的开始端点/结束端点 */ var start = config.start, end = config.end, offset = config.offset, verticalLength = config.verticalLength, type = config.type; var pointPosition = { leftX: 0, leftY: 0, rightX: 0, rightY: 0, }; // // 边与水平线的夹角 var angleOfHorizontal = Math.atan((end.y - start.y) / (end.x - start.x)); // 边和两边点的夹角 var angleOfPoints = Math.atan(offset / verticalLength); // 点到起点的距离 var len = Math.sqrt(verticalLength * verticalLength + offset * offset); if (type === 'start') { if (end.x >= start.x) { pointPosition.leftX = start.x + len * Math.sin(angleOfHorizontal + angleOfPoints); pointPosition.leftY = start.y - len * Math.cos(angleOfHorizontal + angleOfPoints); pointPosition.rightX = start.x - len * Math.sin(angleOfHorizontal - angleOfPoints); pointPosition.rightY = start.y + len * Math.cos(angleOfHorizontal - angleOfPoints); } else { pointPosition.leftX = start.x - len * Math.sin(angleOfHorizontal + angleOfPoints); pointPosition.leftY = start.y + len * Math.cos(angleOfHorizontal + angleOfPoints); pointPosition.rightX = start.x + len * Math.sin(angleOfHorizontal - angleOfPoints); pointPosition.rightY = start.y - len * Math.cos(angleOfHorizontal - angleOfPoints); } } else if (type === 'end') { if (end.x >= start.x) { pointPosition.leftX = end.x + len * Math.sin(angleOfHorizontal - angleOfPoints); pointPosition.leftY = end.y - len * Math.cos(angleOfHorizontal - angleOfPoints); pointPosition.rightX = end.x - len * Math.sin(angleOfHorizontal + angleOfPoints); pointPosition.rightY = end.y + len * Math.cos(angleOfHorizontal + angleOfPoints); } else { pointPosition.leftX = end.x - len * Math.sin(angleOfHorizontal - angleOfPoints); pointPosition.leftY = end.y + len * Math.cos(angleOfHorizontal - angleOfPoints); pointPosition.rightX = end.x + len * Math.sin(angleOfHorizontal + angleOfPoints); pointPosition.rightY = end.y - len * Math.cos(angleOfHorizontal + angleOfPoints); } } return pointPosition; };