let util = require("../util"); class NetworkUtil { constructor() {} /** * Find the center position of the network considering the bounding boxes * * @param {Array} allNodes * @param {Array} [specificNodes=[]] * @returns {{minX: number, maxX: number, minY: number, maxY: number}} */ static getRange(allNodes, specificNodes = []) { var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; if (specificNodes.length > 0) { for (var i = 0; i < specificNodes.length; i++) { node = allNodes[specificNodes[i]]; if (minX > node.shape.boundingBox.left) { minX = node.shape.boundingBox.left; } if (maxX < node.shape.boundingBox.right) { maxX = node.shape.boundingBox.right; } if (minY > node.shape.boundingBox.top) { minY = node.shape.boundingBox.top; } // top is negative, bottom is positive if (maxY < node.shape.boundingBox.bottom) { maxY = node.shape.boundingBox.bottom; } // top is negative, bottom is positive } } if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { minY = 0, maxY = 0, minX = 0, maxX = 0; } return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; } /** * Find the center position of the network * * @param {Array} allNodes * @param {Array} [specificNodes=[]] * @returns {{minX: number, maxX: number, minY: number, maxY: number}} */ static getRangeCore(allNodes, specificNodes = []) { var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node; if (specificNodes.length > 0) { for (var i = 0; i < specificNodes.length; i++) { node = allNodes[specificNodes[i]]; if (minX > node.x) { minX = node.x; } if (maxX < node.x) { maxX = node.x; } if (minY > node.y) { minY = node.y; } // top is negative, bottom is positive if (maxY < node.y) { maxY = node.y; } // top is negative, bottom is positive } } if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) { minY = 0, maxY = 0, minX = 0, maxX = 0; } return {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; } /** * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY}; * @returns {{x: number, y: number}} */ static findCenter(range) { return {x: (0.5 * (range.maxX + range.minX)), y: (0.5 * (range.maxY + range.minY))}; } /** * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes. * @param {vis.Item} item * @param {'node'|undefined} type * @returns {{}} */ static cloneOptions(item, type) { let clonedOptions = {}; if (type === undefined || type === 'node') { util.deepExtend(clonedOptions, item.options, true); clonedOptions.x = item.x; clonedOptions.y = item.y; clonedOptions.amountOfConnections = item.edges.length; } else { util.deepExtend(clonedOptions, item.options, true); } return clonedOptions; } } export default NetworkUtil;