<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Graph | Groups</title>
|
|
|
|
<style>
|
|
body {font: 10pt arial;}
|
|
</style>
|
|
|
|
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
|
|
<script type="text/javascript" src="../../vis.js"></script>
|
|
|
|
<script type="text/javascript">
|
|
var nodes = null;
|
|
var edges = null;
|
|
var graph = null;
|
|
|
|
google.load('visualization', '1');
|
|
|
|
// Set callback to run when API is loaded
|
|
google.setOnLoadCallback(draw);
|
|
|
|
// Called when the Visualization API is loaded.
|
|
function draw() {
|
|
// Create and populate a data table.
|
|
nodes = new google.visualization.DataTable();
|
|
nodes.addColumn('number', 'id');
|
|
nodes.addColumn('string', 'text');
|
|
nodes.addColumn('number', 'group');
|
|
|
|
edges = new google.visualization.DataTable();
|
|
edges.addColumn('number', 'from');
|
|
edges.addColumn('number', 'to');
|
|
edges.addColumn('number', 'length');
|
|
edges.addColumn('string', 'color');
|
|
var color = 'gray';
|
|
var len = undefined;
|
|
|
|
// randomly create some nodes
|
|
var nodeCount = parseInt(document.getElementById('nodeCount').value);
|
|
var nodeOffset = 0;
|
|
var groupMin = 0;
|
|
var groupMax = parseInt(document.getElementById('groupCount').value);
|
|
var group = groupMin;
|
|
var groupLeader = new Array(); // will contain the node id with the most links of each group
|
|
while (group < groupMax) {
|
|
// randomly create some nodes
|
|
var i = 0;
|
|
var cols = parseInt(Math.sqrt(nodeCount));
|
|
var connectionCount = new Array();
|
|
while (i < nodeCount) {
|
|
nodes.addRow([i + nodeOffset, i + nodeOffset + '', group]);
|
|
connectionCount[i] = 0;
|
|
|
|
// create links in a scale-free-graph way
|
|
if (i == 1) {
|
|
var from = i;
|
|
var to = 0;
|
|
edges.addRow([from + nodeOffset, to + nodeOffset, len, color]);
|
|
connectionCount[from]++;
|
|
connectionCount[to]++;
|
|
}
|
|
else if (i > 1) {
|
|
var conn = (i - 1) * 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.addRow([from + nodeOffset, to + nodeOffset, len, color]);
|
|
connectionCount[from]++;
|
|
connectionCount[to]++;
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
// calculate the node with the most number of connections
|
|
var leader = 0;
|
|
for (c in connectionCount) {
|
|
if (connectionCount[c] > connectionCount[leader])
|
|
leader = parseInt(c);
|
|
}
|
|
|
|
if (group > groupMin) {
|
|
// connect to the leader of this group to the leader of a random other group
|
|
var from = leader + nodeOffset;
|
|
var to = groupLeader[groupMin + parseInt(Math.random() * (group - groupMin))];
|
|
edges.addRow([from, to, len, color]);
|
|
}
|
|
|
|
// add this leader to the list
|
|
groupLeader[group] = leader + nodeOffset;
|
|
|
|
nodeOffset += nodeCount;
|
|
group++;
|
|
}
|
|
|
|
// specify options
|
|
var options = {
|
|
width: '600px',
|
|
height: '600px',
|
|
stabilize: false,
|
|
nodes: {
|
|
style: 'dot'
|
|
},
|
|
edges: {
|
|
length: 50
|
|
}
|
|
};
|
|
|
|
// Instantiate our graph object.
|
|
graph = new vis.Graph(document.getElementById('mygraph'));
|
|
|
|
// Draw our graph with the created data and options
|
|
graph.draw(nodes, edges, options);
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<form onsubmit= "javascript: draw(); return false;">
|
|
Number of groups:
|
|
<input type="text" value="6" id="groupCount" style="width: 50px;">
|
|
Number of nodes per group:
|
|
<input type="text" value="7" id="nodeCount" style="width: 50px;">
|
|
<input type="submit" value="Go">
|
|
</form>
|
|
<br>
|
|
|
|
<div id="mygraph"></div>
|
|
|
|
<div id="info"></div>
|
|
</body>
|
|
</html>
|