@dagrejs/dagre
Version:
Graph layout for JavaScript
38 lines (31 loc) • 1.06 kB
JavaScript
let util = require("../util");
module.exports = initOrder;
/*
* Assigns an initial order value for each node by performing a DFS search
* starting from nodes in the first rank. Nodes are assigned an order in their
* rank as they are first visited.
*
* This approach comes from Gansner, et al., "A Technique for Drawing Directed
* Graphs."
*
* Returns a layering matrix with an array per layer and each layer sorted by
* the order of its nodes.
*/
function initOrder(g) {
let visited = {};
let simpleNodes = g.nodes().filter(v => !g.children(v).length);
let simpleNodesRanks = simpleNodes.map(v => g.node(v).rank);
let maxRank = util.applyWithChunking(Math.max, simpleNodesRanks);
let layers = util.range(maxRank + 1).map(() => []);
function dfs(v) {
if (visited[v]) return;
visited[v] = true;
let node = g.node(v);
layers[node.rank].push(v);
g.successors(v).forEach(dfs);
}
let orderedVs = simpleNodes.sort((a, b) => g.node(a).rank - g.node(b).rank);
orderedVs.forEach(dfs);
return layers;
}
;