butterfly-dag
Version:
一个基于数据驱动的节点式编排组件库,让你有方便快捷定制可视化流程图表
62 lines (51 loc) • 2.41 kB
JavaScript
;
import { _calcOrientation } from './_utils.js';
const drawBrokenLine = (sourcePoint, targetPoint) => {
if (!sourcePoint.orientation) {
sourcePoint.orientation = _calcOrientation(targetPoint.pos[0], targetPoint.pos[1], sourcePoint.pos[0],
sourcePoint.pos[1]);
}
if (!targetPoint.orientation) {
targetPoint.orientation = _calcOrientation(sourcePoint.pos[0], sourcePoint.pos[1], targetPoint.pos[0],
targetPoint.pos[1]);
}
let _so = sourcePoint.orientation;
let _to = targetPoint.orientation;
let distX = Math.abs(sourcePoint.pos[0] - targetPoint.pos[0]);
let distY = Math.abs(sourcePoint.pos[1] - targetPoint.pos[1]);
let inflectionPoint = [];
// 起始点
let result = ['M', sourcePoint.pos[0], sourcePoint.pos[1]];
//正常情况
inflectionPoint = [targetPoint.pos[0] + distX * 0.2 * _to[0], targetPoint.pos[1] + distY * 0.2 * _to[1]];
//水平
if (targetPoint.pos[1] === sourcePoint.pos[1] || targetPoint.pos[0] === sourcePoint.pos[0]) {
inflectionPoint = [];
}
//特殊情况
let sourceInflectionPoint = [];
if (_so[0] === -1 && targetPoint.pos[0] > sourcePoint.pos[0] ||
_so[0] === 1 && targetPoint.pos[0] < sourcePoint.pos[0] ||
_so[1] === 1 && targetPoint.pos[1] < sourcePoint.pos[1] ||
_so[1] === -1 && targetPoint.pos[1] > sourcePoint.pos[1]) {
inflectionPoint = [];
sourceInflectionPoint = [sourcePoint.pos[0] + distX * 0.2 * _so[0], sourcePoint.pos[1] + distY * 0.2 * _so[1]];
if (_so[0] * _to[0] === -1 || _so[1] * _to[1] === -1) {
inflectionPoint = [targetPoint.pos[0] + distX * 0.2 * _to[0], targetPoint.pos[1] + distY * 0.2 * _to[1]];
}
}
if (sourceInflectionPoint.length) {
result = _so[0] ? result.concat(['H', sourceInflectionPoint[0]]) : result.concat(['V', sourceInflectionPoint[1]]);
}
if (inflectionPoint.length) {
result = result.concat(['L', inflectionPoint[0], inflectionPoint[1]]);
}
// 结束点
if (sourceInflectionPoint.length && !inflectionPoint.length) {
result = result.concat(['L', targetPoint.pos[0], targetPoint.pos[1]]);
} else {
result = _to[0] ? result.concat(['H', targetPoint.pos[0]]) : result.concat(['V', targetPoint.pos[1]]);
}
return result.join(' ');
}
export default drawBrokenLine;