<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Graph | Groups</title>
|
|
|
|
<style>
|
|
body {
|
|
font: 10pt arial;
|
|
}
|
|
#mygraph {
|
|
width: 600px;
|
|
height: 600px;
|
|
border: 1px solid lightgray;
|
|
}
|
|
</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() {
|
|
var from, to;
|
|
|
|
nodes = [];
|
|
edges = [];
|
|
|
|
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 = []; // 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 = [];
|
|
while (i < nodeCount) {
|
|
nodes.push({
|
|
id: i + nodeOffset,
|
|
label: String(i + nodeOffset),
|
|
group: group
|
|
});
|
|
connectionCount[i] = 0;
|
|
|
|
// create links in a scale-free-graph way
|
|
if (i == 1) {
|
|
from = i;
|
|
to = 0;
|
|
edges.push({
|
|
from: from + nodeOffset,
|
|
to: to + nodeOffset,
|
|
length: len,
|
|
color: 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++;
|
|
}
|
|
|
|
from = i;
|
|
to = j;
|
|
edges.push({
|
|
from: from + nodeOffset,
|
|
to: to + nodeOffset,
|
|
length: len,
|
|
color: color
|
|
});
|
|
connectionCount[from]++;
|
|
connectionCount[to]++;
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
// calculate the node with the most number of connections
|
|
var leader = 0;
|
|
for (var c in connectionCount) {
|
|
if (connectionCount.hasOwnProperty(c)) {
|
|
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
|
|
from = leader + nodeOffset;
|
|
to = groupLeader[groupMin + parseInt(Math.random() * (group - groupMin))];
|
|
edges.push({
|
|
from: from,
|
|
to: to,
|
|
length: len,
|
|
color: color
|
|
});
|
|
}
|
|
|
|
// add this leader to the list
|
|
groupLeader[group] = leader + nodeOffset;
|
|
|
|
nodeOffset += nodeCount;
|
|
group++;
|
|
}
|
|
|
|
// create a graph
|
|
var container = document.getElementById('mygraph');
|
|
var data = {
|
|
nodes: nodes,
|
|
edges: edges
|
|
};
|
|
var options = {
|
|
stabilize: false,
|
|
nodes: {
|
|
shape: 'dot'
|
|
},
|
|
edges: {
|
|
length: 50
|
|
}
|
|
};
|
|
graph = new vis.Graph(container, data, options);
|
|
}
|
|
</script>
|
|
</head>
|
|
|
|
<body onload="draw()">
|
|
<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>
|
|
|
|
</body>
|
|
</html>
|