|
|
- <!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>
|