<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Network | Animation</title>
|
|
|
|
<style type="text/css">
|
|
body {
|
|
font: 10pt sans;
|
|
}
|
|
#mynetwork {
|
|
width: 600px;
|
|
height: 600px;
|
|
border: 1px solid lightgray;
|
|
}
|
|
|
|
div.left {
|
|
position:relative;
|
|
float:left;
|
|
width:300px;
|
|
border: 1px #c7c7c7 solid;
|
|
height:590px;
|
|
padding:5px;
|
|
}
|
|
|
|
div.right {
|
|
padding-left:10px;
|
|
float:left;
|
|
width:600px;
|
|
}
|
|
|
|
div.bottom {
|
|
position:absolute;
|
|
bottom:5px;
|
|
}
|
|
</style>
|
|
|
|
<script type="text/javascript" src="../../dist/vis.js"></script>
|
|
<link href="../../dist/vis.css" rel="stylesheet" type="text/css" />
|
|
|
|
<script type="text/javascript">
|
|
var nodes = null;
|
|
var edges = null;
|
|
var network = null;
|
|
|
|
var doButton, focusButton, showButton;
|
|
var statusUpdateSpan;
|
|
var finishMessage = "";
|
|
|
|
function destroy() {
|
|
if (network !== null) {
|
|
network.destroy();
|
|
network = null;
|
|
}
|
|
}
|
|
|
|
function draw() {
|
|
destroy();
|
|
statusUpdateSpan = document.getElementById("statusUpdate");
|
|
doButton = document.getElementById("btnDo");
|
|
focusButton = document.getElementById("btnFocus");
|
|
showButton = document.getElementById("btnShow");
|
|
nodes = [];
|
|
edges = [];
|
|
var connectionCount = [];
|
|
|
|
// randomly create some nodes and edges
|
|
var nodeCount = 25;
|
|
for (var i = 0; i < nodeCount; i++) {
|
|
nodes.push({
|
|
id: i,
|
|
label: String(i)
|
|
});
|
|
|
|
connectionCount[i] = 0;
|
|
|
|
// create edges in a scale-free-network way
|
|
if (i == 1) {
|
|
var from = i;
|
|
var to = 0;
|
|
edges.push({
|
|
from: from,
|
|
to: to
|
|
});
|
|
connectionCount[from]++;
|
|
connectionCount[to]++;
|
|
}
|
|
else if (i > 1) {
|
|
var conn = edges.length * 2;
|
|
var rand = Math.floor(Math.random() * conn);
|
|
var cum = 0;
|
|
var j = 0;
|
|
while (j < connectionCount.length && cum < rand) {
|
|
cum += connectionCount[j];
|
|
j++;
|
|
}
|
|
|
|
|
|
var from = i;
|
|
var to = j;
|
|
edges.push({
|
|
from: from,
|
|
to: to
|
|
});
|
|
connectionCount[from]++;
|
|
connectionCount[to]++;
|
|
}
|
|
}
|
|
|
|
// create a network
|
|
var container = document.getElementById('mynetwork');
|
|
var data = {
|
|
nodes: nodes,
|
|
edges: edges
|
|
};
|
|
var options = {stabilizationIterations:1200};
|
|
network = new vis.Network(container, data, options);
|
|
|
|
// add event listeners
|
|
network.on('select', function(params) {
|
|
document.getElementById('selection').innerHTML = 'Selection: ' + params.nodes;
|
|
});
|
|
network.on('stabilized', function (params) {
|
|
document.getElementById('stabilization').innerHTML = 'Stabilization took ' + params.iterations + ' iterations.';
|
|
});
|
|
network.on("animationFinished", function() {
|
|
statusUpdateSpan.innerHTML = finishMessage;
|
|
})
|
|
|
|
}
|
|
|
|
function zoomExtentAnimated() {
|
|
var offsetx = parseInt(document.getElementById("offsetx").value);
|
|
var offsety = parseInt(document.getElementById("offsety").value);
|
|
var duration = parseInt(document.getElementById("duration").value);
|
|
var easingFunction = document.getElementById("easingFunction").value;
|
|
|
|
var options = {offset: {x:offsetx,y:offsety},
|
|
duration: duration,
|
|
easingFunction: easingFunction
|
|
}
|
|
statusUpdateSpan.innerHTML = "Doing ZoomExtent() Animation.";
|
|
finishMessage = "Animation finished."
|
|
network.zoomExtent(options);
|
|
}
|
|
|
|
function doDefaultAnimation() {
|
|
var offsetx = parseInt(document.getElementById("offsetx").value);
|
|
var offsety = parseInt(document.getElementById("offsety").value);
|
|
var scale = parseFloat(document.getElementById("scale").value);
|
|
var positionx = parseInt(document.getElementById("positionx").value);
|
|
var positiony = parseInt(document.getElementById("positiony").value);
|
|
var easingFunction = document.getElementById("easingFunction").value;
|
|
|
|
var options = {
|
|
position: {x:positionx,y:positiony},
|
|
scale: scale,
|
|
offset: {x:offsetx,y:offsety},
|
|
animation: true // default duration is 1000ms and default easingFunction is easeInOutQuad.
|
|
}
|
|
statusUpdateSpan.innerHTML = "Doing Animation.";
|
|
finishMessage = "Animation finished."
|
|
network.moveTo(options);
|
|
}
|
|
|
|
function doAnimation() {
|
|
var offsetx = parseInt(document.getElementById("offsetx").value);
|
|
var offsety = parseInt(document.getElementById("offsety").value);
|
|
var duration = parseInt(document.getElementById("duration").value);
|
|
var scale = parseFloat(document.getElementById("scale").value);
|
|
var positionx = parseInt(document.getElementById("positionx").value);
|
|
var positiony = parseInt(document.getElementById("positiony").value);
|
|
var easingFunction = document.getElementById("easingFunction").value;
|
|
|
|
var options = {
|
|
position: {x:positionx,y:positiony},
|
|
scale: scale,
|
|
offset: {x:offsetx,y:offsety},
|
|
animation: {
|
|
duration: duration,
|
|
easingFunction: easingFunction
|
|
}
|
|
}
|
|
statusUpdateSpan.innerHTML = "Doing Animation.";
|
|
finishMessage = "Animation finished."
|
|
network.moveTo(options);
|
|
}
|
|
|
|
function focusRandom() {
|
|
var nodeId = Math.floor(Math.random() * 25);
|
|
var offsetx = parseInt(document.getElementById("offsetx").value);
|
|
var offsety = parseInt(document.getElementById("offsety").value);
|
|
var duration = parseInt(document.getElementById("duration").value);
|
|
var scale = parseFloat(document.getElementById("scale").value);
|
|
var easingFunction = document.getElementById("easingFunction").value;
|
|
|
|
var options = {
|
|
// position: {x:positionx,y:positiony}, // this is not relevant when focusing on nodes
|
|
scale: scale,
|
|
offset: {x:offsetx,y:offsety},
|
|
animation: {
|
|
duration: duration,
|
|
easingFunction: easingFunction
|
|
}
|
|
}
|
|
statusUpdateSpan.innerHTML = "Focusing on node: " + nodeId;
|
|
finishMessage = "Node: " + nodeId + " in focus.";
|
|
network.focusOnNode(nodeId, options);
|
|
}
|
|
|
|
|
|
var showInterval = false;
|
|
var showPhase = 1;
|
|
function startShow() {
|
|
if (showInterval !== false) {
|
|
showInterval = false;
|
|
showButton.value = "Start a show!";
|
|
network.zoomExtent();
|
|
}
|
|
else {
|
|
showButton.value = "Stop the show!";
|
|
var duration = parseInt(document.getElementById("duration").value);
|
|
focusRandom();
|
|
window.setTimeout(doTheShow, duration);
|
|
showInterval = true;
|
|
}
|
|
}
|
|
|
|
function doTheShow() {
|
|
if (showInterval == true) {
|
|
var duration = parseInt(document.getElementById("duration").value);
|
|
if (showPhase == 0) {
|
|
focusRandom();
|
|
showPhase = 1;
|
|
}
|
|
else {
|
|
zoomExtentAnimated();
|
|
showPhase = 0;
|
|
}
|
|
window.setTimeout(doTheShow, duration);
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body onload="draw();">
|
|
<h2>Camera animations</h2>
|
|
<div style="width:700px; font-size:14px;">
|
|
You can move the view around programmatically using the .moveTo(options) function. The options supplied to this function can
|
|
also be (partially) supplied to the .zoomExtent() and .focusOnNode() methods. These are explained in the docs.
|
|
<br /><br/>
|
|
The buttons below take the fields from the table when they can. For instance, the "Animate with default settings." takes the position, scale and offset while using
|
|
the default animation values for duration and easing function. The focusOnNode takes everything except the position and the zoomExtent takes only the duration and easing function.
|
|
<br/><br/>
|
|
Here you can see a full description of the options you can supply to moveTo:
|
|
</div>
|
|
<pre>
|
|
var moveToOptions = {
|
|
position: {x:x, y:x}, // position to animate to (Numbers)
|
|
scale: 1.0, // scale to animate to (Number)
|
|
offset: {x:x, y:y}, // offset from the center in DOM pixels (Numbers)
|
|
animation: { // animation object, can also be Boolean
|
|
duration: 1000, // animation duration in milliseconds (Number)
|
|
easingFunction: "easeInOutQuad" // Animation easing function, available are:
|
|
} // linear, easeInQuad, easeOutQuad, easeInOutQuad,
|
|
} // easeInCubic, easeOutCubic, easeInOutCubic,
|
|
// easeInQuart, easeOutQuart, easeInOutQuart,
|
|
// easeInQuint, easeOutQuint, easeInOutQuint
|
|
</pre>
|
|
<div class="left">
|
|
<table>
|
|
<tr>
|
|
<td>position x</td><td><input type="text" value="300" id="positionx" style="width:170px;"></td>
|
|
</tr>
|
|
<tr>
|
|
<td>position y</td><td><input type="text" value="300" id="positiony" style="width:170px;"></td>
|
|
</tr>
|
|
<tr>
|
|
<td>scale</td><td><input type="text" value="1.0" id="scale" style="width:170px;"></td>
|
|
</tr>
|
|
<tr>
|
|
<td>offset x</td><td><input type="text" value="0" id="offsetx" style="width:170px;"> px</td>
|
|
</tr>
|
|
<tr>
|
|
<td>offset y</td><td><input type="text" value="0" id="offsety" style="width:170px;"> px</td>
|
|
</tr>
|
|
<tr>
|
|
<td>duration</td><td><input type="text" value="2500" id="duration" style="width:170px;"> ms</td>
|
|
</tr>
|
|
<tr>
|
|
<td>easingFunction</td><td>
|
|
<select id="easingFunction" style="width:174px;">
|
|
<option value="linear">linear</option>
|
|
<option value="easeInQuad">easeInQuad</option>
|
|
<option value="easeOutQuad">easeOutQuad</option>
|
|
<option value="easeInOutQuad" selected="selected">easeInOutQuad</option>
|
|
<option value="easeInCubic">easeInCubic</option>
|
|
<option value="easeOutCubic">easeOutCubic</option>
|
|
<option value="easeInOutCubic">easeInOutCubic</option>
|
|
<option value="easeInQuart">easeInQuart</option>
|
|
<option value="easeOutQuart">easeOutQuart</option>
|
|
<option value="easeInOutQuart">easeInOutQuart</option>
|
|
<option value="easeInQuint">easeInQuint</option>
|
|
<option value="easeOutQuint">easeOutQuint</option>
|
|
<option value="easeInOutQuint">easeInOutQuint</option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<div class="bottom">
|
|
<span id="statusUpdate"></span><br />
|
|
Examples:
|
|
<input type="button" onclick="doAnimation();" value="Animate with above settings." style="width:300px;" id="btnDo"> <br/>
|
|
<input type="button" onclick="doDefaultAnimation();" value="Animate with default settings." style="width:300px;" id="btnDoDefault"> <br/>
|
|
<input type="button" onclick="zoomExtentAnimated();" value="Animated ZoomExtent()." style="width:300px;" id="btnZoom"> <br/>
|
|
<input type="button" onclick="focusRandom();" value="Focus on random node." style="width:300px;" id="btnFocus"><br/>
|
|
<input type="button" onclick="startShow();" value="Start a show!" style="width:300px;" id="btnShow"><br/>
|
|
</div>
|
|
</div>
|
|
<div class="right">
|
|
<div id="mynetwork"></div>
|
|
|
|
<p id="selection"></p>
|
|
<p id="stabilization"></p>
|
|
</div>
|
|
</body>
|
|
</html>
|