|
@ -5,7 +5,7 @@ |
|
|
* A dynamic, browser-based visualization library. |
|
|
* A dynamic, browser-based visualization library. |
|
|
* |
|
|
* |
|
|
* @version 1.0.2-SNAPSHOT |
|
|
* @version 1.0.2-SNAPSHOT |
|
|
* @date 2014-05-23 |
|
|
|
|
|
|
|
|
* @date 2014-05-28 |
|
|
* |
|
|
* |
|
|
* @license |
|
|
* @license |
|
|
* Copyright (C) 2011-2014 Almende B.V, http://almende.com
|
|
|
* Copyright (C) 2011-2014 Almende B.V, http://almende.com
|
|
@ -11103,7 +11103,7 @@ var physicsMixin = { |
|
|
*/ |
|
|
*/ |
|
|
_calculateSpringForces: function () { |
|
|
_calculateSpringForces: function () { |
|
|
var edgeLength, edge, edgeId; |
|
|
var edgeLength, edge, edgeId; |
|
|
var dx, dy, fx, fy, springForce, length; |
|
|
|
|
|
|
|
|
var dx, dy, fx, fy, springForce, distance; |
|
|
var edges = this.edges; |
|
|
var edges = this.edges; |
|
|
|
|
|
|
|
|
// forces caused by the edges, modelled as springs
|
|
|
// forces caused by the edges, modelled as springs
|
|
@ -11119,13 +11119,14 @@ var physicsMixin = { |
|
|
|
|
|
|
|
|
dx = (edge.from.x - edge.to.x); |
|
|
dx = (edge.from.x - edge.to.x); |
|
|
dy = (edge.from.y - edge.to.y); |
|
|
dy = (edge.from.y - edge.to.y); |
|
|
length = Math.sqrt(dx * dx + dy * dy); |
|
|
|
|
|
|
|
|
distance = Math.sqrt(dx * dx + dy * dy); |
|
|
|
|
|
|
|
|
if (length == 0) { |
|
|
|
|
|
length = 0.01; |
|
|
|
|
|
|
|
|
if (distance == 0) { |
|
|
|
|
|
distance = 0.01; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
springForce = this.constants.physics.springConstant * (edgeLength - length) / length; |
|
|
|
|
|
|
|
|
// the 1/distance is so the fx and fy can be calculated without sine or cosine.
|
|
|
|
|
|
springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; |
|
|
|
|
|
|
|
|
fx = dx * springForce; |
|
|
fx = dx * springForce; |
|
|
fy = dy * springForce; |
|
|
fy = dy * springForce; |
|
@ -11187,17 +11188,18 @@ var physicsMixin = { |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
_calculateSpringForce: function (node1, node2, edgeLength) { |
|
|
_calculateSpringForce: function (node1, node2, edgeLength) { |
|
|
var dx, dy, fx, fy, springForce, length; |
|
|
|
|
|
|
|
|
var dx, dy, fx, fy, springForce, distance; |
|
|
|
|
|
|
|
|
dx = (node1.x - node2.x); |
|
|
dx = (node1.x - node2.x); |
|
|
dy = (node1.y - node2.y); |
|
|
dy = (node1.y - node2.y); |
|
|
length = Math.sqrt(dx * dx + dy * dy); |
|
|
|
|
|
|
|
|
distance = Math.sqrt(dx * dx + dy * dy); |
|
|
|
|
|
|
|
|
if (length == 0) { |
|
|
|
|
|
length = 0.01; |
|
|
|
|
|
|
|
|
if (distance == 0) { |
|
|
|
|
|
distance = 0.01; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
springForce = this.constants.physics.springConstant * (edgeLength - length) / length; |
|
|
|
|
|
|
|
|
// the 1/distance is so the fx and fy can be calculated without sine or cosine.
|
|
|
|
|
|
springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance; |
|
|
|
|
|
|
|
|
fx = dx * springForce; |
|
|
fx = dx * springForce; |
|
|
fy = dy * springForce; |
|
|
fy = dy * springForce; |
|
@ -15735,7 +15737,9 @@ function Graph (container, data, options) { |
|
|
border: '#666', |
|
|
border: '#666', |
|
|
background: '#FFFFC6' |
|
|
background: '#FFFFC6' |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
}, |
|
|
|
|
|
moveable: true, |
|
|
|
|
|
zoomable: true |
|
|
}; |
|
|
}; |
|
|
this.editMode = this.constants.dataManipulation.initiallyVisible; |
|
|
this.editMode = this.constants.dataManipulation.initiallyVisible; |
|
|
|
|
|
|
|
@ -16075,7 +16079,8 @@ Graph.prototype.setOptions = function (options) { |
|
|
if (options.freezeForStabilization !== undefined) {this.constants.freezeForStabilization = options.freezeForStabilization;} |
|
|
if (options.freezeForStabilization !== undefined) {this.constants.freezeForStabilization = options.freezeForStabilization;} |
|
|
if (options.configurePhysics !== undefined){this.constants.configurePhysics = options.configurePhysics;} |
|
|
if (options.configurePhysics !== undefined){this.constants.configurePhysics = options.configurePhysics;} |
|
|
if (options.stabilizationIterations !== undefined) {this.constants.stabilizationIterations = options.stabilizationIterations;} |
|
|
if (options.stabilizationIterations !== undefined) {this.constants.stabilizationIterations = options.stabilizationIterations;} |
|
|
|
|
|
|
|
|
|
|
|
if (options.moveable !== undefined) {this.constants.moveable = options.moveable;} |
|
|
|
|
|
if (options.zoomable !== undefined) {this.constants.zoomable = options.zoomable;} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (options.labels !== undefined) { |
|
|
if (options.labels !== undefined) { |
|
@ -16524,16 +16529,18 @@ Graph.prototype._handleOnDrag = function(event) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
// move the graph
|
|
|
|
|
|
var diffX = pointer.x - this.drag.pointer.x; |
|
|
|
|
|
var diffY = pointer.y - this.drag.pointer.y; |
|
|
|
|
|
|
|
|
|
|
|
this._setTranslation( |
|
|
|
|
|
this.drag.translation.x + diffX, |
|
|
|
|
|
this.drag.translation.y + diffY); |
|
|
|
|
|
this._redraw(); |
|
|
|
|
|
this.moving = true; |
|
|
|
|
|
this.start(); |
|
|
|
|
|
|
|
|
if (this.constants.moveable == true) { |
|
|
|
|
|
// move the graph
|
|
|
|
|
|
var diffX = pointer.x - this.drag.pointer.x; |
|
|
|
|
|
var diffY = pointer.y - this.drag.pointer.y; |
|
|
|
|
|
|
|
|
|
|
|
this._setTranslation( |
|
|
|
|
|
this.drag.translation.x + diffX, |
|
|
|
|
|
this.drag.translation.y + diffY); |
|
|
|
|
|
this._redraw(); |
|
|
|
|
|
this.moving = true; |
|
|
|
|
|
this.start(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
@ -16621,37 +16628,38 @@ Graph.prototype._onPinch = function (event) { |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
Graph.prototype._zoom = function(scale, pointer) { |
|
|
Graph.prototype._zoom = function(scale, pointer) { |
|
|
var scaleOld = this._getScale(); |
|
|
|
|
|
if (scale < 0.00001) { |
|
|
|
|
|
scale = 0.00001; |
|
|
|
|
|
} |
|
|
|
|
|
if (scale > 10) { |
|
|
|
|
|
scale = 10; |
|
|
|
|
|
} |
|
|
|
|
|
// + this.frame.canvas.clientHeight / 2
|
|
|
|
|
|
var translation = this._getTranslation(); |
|
|
|
|
|
|
|
|
|
|
|
var scaleFrac = scale / scaleOld; |
|
|
|
|
|
var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; |
|
|
|
|
|
var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; |
|
|
|
|
|
|
|
|
if (this.constants.zoomable == true) { |
|
|
|
|
|
var scaleOld = this._getScale(); |
|
|
|
|
|
if (scale < 0.00001) { |
|
|
|
|
|
scale = 0.00001; |
|
|
|
|
|
} |
|
|
|
|
|
if (scale > 10) { |
|
|
|
|
|
scale = 10; |
|
|
|
|
|
} |
|
|
|
|
|
// + this.frame.canvas.clientHeight / 2
|
|
|
|
|
|
var translation = this._getTranslation(); |
|
|
|
|
|
|
|
|
this.areaCenter = {"x" : this._canvasToX(pointer.x), |
|
|
|
|
|
"y" : this._canvasToY(pointer.y)}; |
|
|
|
|
|
|
|
|
var scaleFrac = scale / scaleOld; |
|
|
|
|
|
var tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac; |
|
|
|
|
|
var ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac; |
|
|
|
|
|
|
|
|
this._setScale(scale); |
|
|
|
|
|
this._setTranslation(tx, ty); |
|
|
|
|
|
this.updateClustersDefault(); |
|
|
|
|
|
this._redraw(); |
|
|
|
|
|
|
|
|
this.areaCenter = {"x" : this._canvasToX(pointer.x), |
|
|
|
|
|
"y" : this._canvasToY(pointer.y)}; |
|
|
|
|
|
|
|
|
if (scaleOld < scale) { |
|
|
|
|
|
this.emit("zoom", {direction:"+"}); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
this.emit("zoom", {direction:"-"}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
this._setScale(scale); |
|
|
|
|
|
this._setTranslation(tx, ty); |
|
|
|
|
|
this.updateClustersDefault(); |
|
|
|
|
|
this._redraw(); |
|
|
|
|
|
|
|
|
|
|
|
if (scaleOld < scale) { |
|
|
|
|
|
this.emit("zoom", {direction:"+"}); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
this.emit("zoom", {direction:"-"}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return scale; |
|
|
|
|
|
|
|
|
return scale; |
|
|
|
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -17324,7 +17332,7 @@ Graph.prototype._yToCanvas = function(y) { |
|
|
* @returns {{x: number, y: number}} |
|
|
* @returns {{x: number, y: number}} |
|
|
* @constructor |
|
|
* @constructor |
|
|
*/ |
|
|
*/ |
|
|
Graph.prototype.DOMtoCanvas = function(pos) { |
|
|
|
|
|
|
|
|
Graph.prototype.canvasToDOM = function(pos) { |
|
|
return {x:this._xToCanvas(pos.x),y:this._yToCanvas(pos.y)}; |
|
|
return {x:this._xToCanvas(pos.x),y:this._yToCanvas(pos.y)}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -17334,7 +17342,7 @@ Graph.prototype.DOMtoCanvas = function(pos) { |
|
|
* @returns {{x: number, y: number}} |
|
|
* @returns {{x: number, y: number}} |
|
|
* @constructor |
|
|
* @constructor |
|
|
*/ |
|
|
*/ |
|
|
Graph.prototype.canvasToDOM = function(pos) { |
|
|
|
|
|
|
|
|
Graph.prototype.DOMtoCanvas = function(pos) { |
|
|
return {x:this._canvasToX(pos.x),y:this._canvasToY(pos.y)}; |
|
|
return {x:this._canvasToX(pos.x),y:this._canvasToY(pos.y)}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|