|
@ -5,7 +5,7 @@ |
|
|
* A dynamic, browser-based visualization library. |
|
|
* A dynamic, browser-based visualization library. |
|
|
* |
|
|
* |
|
|
* @version 0.4.0-SNAPSHOT |
|
|
* @version 0.4.0-SNAPSHOT |
|
|
* @date 2014-01-21 |
|
|
|
|
|
|
|
|
* @date 2014-01-22 |
|
|
* |
|
|
* |
|
|
* @license |
|
|
* @license |
|
|
* Copyright (C) 2011-2014 Almende B.V, http://almende.com
|
|
|
* Copyright (C) 2011-2014 Almende B.V, http://almende.com
|
|
@ -10893,7 +10893,7 @@ var SectorMixin = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* This runs a function in all active sectors. This is used in _redraw() and the _calculateForces(). |
|
|
|
|
|
|
|
|
* This runs a function in all active sectors. This is used in _redraw() and the _initializeForceCalculation(). |
|
|
* |
|
|
* |
|
|
* @param {String} runFunction | This is the NAME of a function we want to call in all active sectors |
|
|
* @param {String} runFunction | This is the NAME of a function we want to call in all active sectors |
|
|
* | we dont pass the function itself because then the "this" is the window object |
|
|
* | we dont pass the function itself because then the "this" is the window object |
|
@ -12143,7 +12143,7 @@ function Graph (container, data, options) { |
|
|
this._loadClusterSystem(); |
|
|
this._loadClusterSystem(); |
|
|
|
|
|
|
|
|
// call the sector constructor
|
|
|
// call the sector constructor
|
|
|
this._loadSectorSystem(); // would be fantastic if multiple in heritance just worked!
|
|
|
|
|
|
|
|
|
this._loadSectorSystem(); |
|
|
|
|
|
|
|
|
var graph = this; |
|
|
var graph = this; |
|
|
this.freezeSimulation = false;// freeze the simulation
|
|
|
this.freezeSimulation = false;// freeze the simulation
|
|
@ -13705,7 +13705,7 @@ Graph.prototype._doStabilize = function() { |
|
|
var vmin = this.constants.minVelocity; |
|
|
var vmin = this.constants.minVelocity; |
|
|
var stable = false; |
|
|
var stable = false; |
|
|
while (!stable && count < this.constants.maxIterations) { |
|
|
while (!stable && count < this.constants.maxIterations) { |
|
|
this._calculateForces(); |
|
|
|
|
|
|
|
|
this._initializeForceCalculation(); |
|
|
this._discreteStepNodes(); |
|
|
this._discreteStepNodes(); |
|
|
stable = !this._isMoving(vmin); |
|
|
stable = !this._isMoving(vmin); |
|
|
count++; |
|
|
count++; |
|
@ -13716,6 +13716,30 @@ Graph.prototype._doStabilize = function() { |
|
|
// console.log('Stabilized in ' + (end-start) + ' ms, ' + count + ' iterations' ); // TODO: cleanup
|
|
|
// console.log('Stabilized in ' + (end-start) + ' ms, ' + count + ' iterations' ); // TODO: cleanup
|
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Before calculating the forces, we check if we need to cluster to keep up performance and we check |
|
|
|
|
|
* if there is more than one node. If it is just one node, we dont calculate anything. |
|
|
|
|
|
* |
|
|
|
|
|
* @private |
|
|
|
|
|
*/ |
|
|
|
|
|
Graph.prototype._initializeForceCalculation = function() { |
|
|
|
|
|
// stop calculation if there is only one node
|
|
|
|
|
|
if (this.nodeIndices.length == 1) { |
|
|
|
|
|
this.nodes[this.nodeIndices[0]]._setForce(0,0); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
// if there are too many nodes on screen, we cluster without repositioning
|
|
|
|
|
|
if (this.nodeIndices.length > this.constants.clustering.absoluteMaxNumberOfNodes && this.constants.clustering.enabled == true) { |
|
|
|
|
|
this.clusterToFit(this.constants.clustering.reduceToMaxNumberOfNodes, false); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// we now start the force calculation
|
|
|
|
|
|
this._calculateForces(); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Calculate the external forces acting on the nodes |
|
|
* Calculate the external forces acting on the nodes |
|
|
* Forces are caused by: edges, repulsing forces between nodes, gravity |
|
|
* Forces are caused by: edges, repulsing forces between nodes, gravity |
|
@ -13729,7 +13753,7 @@ Graph.prototype._calculateForces = function() { |
|
|
// if there are too many nodes on screen, we cluster without repositioning
|
|
|
// if there are too many nodes on screen, we cluster without repositioning
|
|
|
else if (this.nodeIndices.length > this.constants.clustering.absoluteMaxNumberOfNodes && this.constants.clustering.enabled == true) { |
|
|
else if (this.nodeIndices.length > this.constants.clustering.absoluteMaxNumberOfNodes && this.constants.clustering.enabled == true) { |
|
|
this.clusterToFit(this.constants.clustering.reduceToMaxNumberOfNodes, false); |
|
|
this.clusterToFit(this.constants.clustering.reduceToMaxNumberOfNodes, false); |
|
|
this._calculateForces(); |
|
|
|
|
|
|
|
|
this._initializeForceCalculation(); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
this.canvasTopLeft = {"x": (0-this.translation.x)/this.scale, |
|
|
this.canvasTopLeft = {"x": (0-this.translation.x)/this.scale, |
|
@ -13971,7 +13995,7 @@ Graph.prototype._discreteStepNodes = function() { |
|
|
Graph.prototype.start = function() { |
|
|
Graph.prototype.start = function() { |
|
|
if (!this.freezeSimulation) { |
|
|
if (!this.freezeSimulation) { |
|
|
if (this.moving) { |
|
|
if (this.moving) { |
|
|
this._doInAllActiveSectors("_calculateForces"); |
|
|
|
|
|
|
|
|
this._doInAllActiveSectors("_initializeForceCalculation"); |
|
|
this._doInAllActiveSectors("_discreteStepNodes"); |
|
|
this._doInAllActiveSectors("_discreteStepNodes"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -14003,7 +14027,7 @@ Graph.prototype.start = function() { |
|
|
|
|
|
|
|
|
Graph.prototype.singleStep = function() { |
|
|
Graph.prototype.singleStep = function() { |
|
|
if (this.moving) { |
|
|
if (this.moving) { |
|
|
this._calculateForces(); |
|
|
|
|
|
|
|
|
this._initializeForceCalculation(); |
|
|
this._discreteStepNodes(); |
|
|
this._discreteStepNodes(); |
|
|
|
|
|
|
|
|
var vmin = this.constants.minVelocity; |
|
|
var vmin = this.constants.minVelocity; |
|
|