diff --git a/GraphNode.js b/GraphNode.js index a9e9157..85caaf8 100644 --- a/GraphNode.js +++ b/GraphNode.js @@ -41,6 +41,7 @@ class GraphNode { } } + // TODO: move affinity to LayoutNode setAffinity(nodes) { const INF = 999999; @@ -63,6 +64,11 @@ class GraphNode { if (node.label == this.label) { this.addAffinity(node, (d, v) => v[0] == 0 ? 200 : 500); } + + // Try to preserve pagerank left-to-right flow from initial positions + let rankSign = Math.sign(node.pageRank - this.pageRank); + this.addAffinity(node, (d, v) => + [Math.sign(v[0]) == rankSign ? 0 : -500, 0]); } for (let to of this.links) { diff --git a/LayoutNode.js b/LayoutNode.js index 0ecaf35..bdc349b 100644 --- a/LayoutNode.js +++ b/LayoutNode.js @@ -36,10 +36,17 @@ class LayoutNode { // Avoid calling sqrt(), since the results are used relatively let distanceSquared = vec[0] * vec[0] + vec[1] * vec[1]; let weight = aff.distanceToWeight(distanceSquared, vec); - for (let i of [0, 1]) { - this.vec[i] += (weight * vec[i]) / vecsum; + if (weight instanceof Array) { + for (let i of [0, 1]) { + this.vec[i] += weight[i]; + this.tension += Math.abs(weight[i]); + } + } else { + for (let i of [0, 1]) { + this.vec[i] += (weight * vec[i]) / vecsum; + } + this.tension += Math.abs(weight); } - this.tension += Math.abs(weight); } }