var table, i, j, m, uniqueNodesID, uniqueNodes, edges, plotSize; function preload() { table = loadTable('edges698.csv', 'csv', 'header'); } function setup() { createCanvas(1600, 1600); plotSize = 800; uniqueNodes = []; uniqueNodesID = []; edges = []; for (i = 0 ; i < table.getRowCount() ; i++) { for (j = 0 ; j < 2 ; j++) { if (!(uniqueNodesID.includes(table.getString(i, j)))) { append(uniqueNodesID, table.getString(i, j)); } } append(edges, {node1 : table.getString(i, 0), node2 : table.getString(i, 1)}); } uniqueNodesID = sort(uniqueNodesID, uniqueNodesID.length); for (i = 0 ; i < uniqueNodesID.length ; i++) { uniqueNodes[i] = {nodeId : uniqueNodesID[i], posX : (Math.random() - .5) * plotSize, posY : (Math.random() - .5) * plotSize, dispX : 0, dispY : 0}; } } function draw() { var area, k, deltaX, deltaY, u, v; background(255); textSize(15); fill(255); rect(0, 0, plotSize, plotSize); fill(125, 0, 125, 100); area = sq(plotSize + 500); k = sqrt(area / uniqueNodes.length); for (i = 0 ; i < 10 ; i++) { // For each vertex for each other vertex for (j = 0 ; j < uniqueNodes.length ; j++) { uniqueNodes[j].dispX = 0; uniqueNodes[j].dispY = 0; for (m = 0 ; m < uniqueNodes.length ; m++) { if (m != j) { deltaX = uniqueNodes[j].posX - uniqueNodes[m].posX; deltaY = uniqueNodes[j].posY - uniqueNodes[m].posY; uniqueNodes[j].dispX = uniqueNodes[j].dispX + (deltaX / abs(deltaX)) * (sq(k) / abs(deltaX)); uniqueNodes[j].dispY = uniqueNodes[j].dispY + (deltaY / abs(deltaY)) * (sq(k) / abs(deltaY)); } } } // For each edge for (j = 0 ; j < edges.length ; j++) { v = uniqueNodes[uniqueNodesID.indexOf(edges[j].node1)]; u = uniqueNodes[uniqueNodesID.indexOf(edges[j].node2)]; deltaX = v.posX - u.posX; deltaY = v.posY - u.posY; uniqueNodes[uniqueNodesID.indexOf(edges[j].node1)].dispX = v.dispX - (deltaX / abs(deltaX)) * (sq(deltaX) / k); uniqueNodes[uniqueNodesID.indexOf(edges[j].node1)].dispY = v.dispY - (deltaY / abs(deltaY)) * (sq(deltaY) / k); uniqueNodes[uniqueNodesID.indexOf(edges[j].node2)].dispX = u.dispX + (deltaX / abs(deltaX)) * (sq(deltaX) / k); uniqueNodes[uniqueNodesID.indexOf(edges[j].node2)].dispY = u.dispY + (deltaY / abs(deltaY)) * (sq(deltaY) / k); } // For each vertex for (j = 0 ; j < uniqueNodes.length ; j++) { if (uniqueNodes[j].dispX != 0) { uniqueNodes[j].posX = uniqueNodes[j].posX + (uniqueNodes[j].dispX / abs(uniqueNodes[j].dispX)); } if (uniqueNodes[j].dispY != 0) { uniqueNodes[j].posY = uniqueNodes[j].posY + (uniqueNodes[j].dispY / abs(uniqueNodes[j].dispY)); } uniqueNodes[j].posX = min(plotSize / 2, max(plotSize / 2 * -1, uniqueNodes[j].posX)); uniqueNodes[j].posY = min(plotSize / 2, max(plotSize / 2 * -1, uniqueNodes[j].posY)); } } // Draw the nodes for (i = 0 ; i < uniqueNodes.length ; i++) { // Interactive highlighting of the node and displaying the number in the top left corner. if (dist(mouseX, mouseY, (plotSize / 2) + uniqueNodes[i].posX, (plotSize / 2) + uniqueNodes[i].posY) < 10) { fill(0); text("Node: " + uniqueNodes[i].nodeId, 5, 15); fill(200, 0, 200); } else { fill(125, 0, 125, 100); } ellipse((plotSize / 2) + uniqueNodes[i].posX, (plotSize / 2) + uniqueNodes[i].posY, 15); } // Draw the edges for (i = 0 ; i < edges.length ; i++) { v = uniqueNodes[uniqueNodesID.indexOf(edges[i].node1)]; u = uniqueNodes[uniqueNodesID.indexOf(edges[i].node2)]; // Interactive lines for all edges if (dist(mouseX, mouseY, (plotSize / 2) + v.posX, (plotSize / 2) + v.posY) < 10) { stroke(0, 200, 200); } else if (dist(mouseX, mouseY, (plotSize / 2) + u.posX, (plotSize / 2) + u.posY) < 10) { stroke(0, 200, 200); } else { stroke(0); } line(v.posX + (plotSize / 2), v.posY + (plotSize / 2), u.posX + (plotSize / 2), u.posY + (plotSize / 2)); } }