Add an API entry to calculate stress

This commit is contained in:
Pitchaya Boonsarngsuk
2018-01-26 13:10:09 +00:00
parent 665b5a89a6
commit 44a5c8561a
2 changed files with 12 additions and 8 deletions

View File

@@ -18,3 +18,6 @@ export { default as forceLinkTweaked}
export { default as hybridSimulation}
from "./src/hybridSimulation";
export { getStress as calculateStress }
from "./src/stress";

View File

@@ -1,19 +1,20 @@
/**
* Calculates the stress. Basically, it computes the difference between
* high dimensional distance and real distance. The lower the stress is,
* the better layout.
* Calculates the stress of a system by comparing the difference between the
* high dimensional distance and 2D distance. The lower the stress contributes
* to the better layout.
* @return {number} - stress of the layout.
*/
export function getStress(nodes, distance) {
let totalDiffSq = 0, totalHighDistSq = 0;
for (let j = 0; j < nodes.length; j++) {
let sumDiffSq = 0
let sumHighDistSq = 0;
for (let j = nodes.length-1; j >= 1; j++) {
for (let i = 0; i < j; i++) {
let source = nodes[i], target = nodes[j];
let lowDDist = Math.hypot(target.x - source.x, target.y - source.y);
let highDDist = distance(source, target);
totalDiffSq += Math.pow(highDDist - lowDDist, 2);
totalLowDDistSq += lowDDist * lowDDist;
sumDiffSq += Math.pow(highDDist - lowDDist, 2);
sumLowDDistSq += lowDDist * lowDDist;
}
}
return Math.sqrt(totalDiffSq / totalLowDDistSq);
return Math.sqrt(sumDiffSq / sumLowDDistSq);
}