var table; var edges = []; var nodes = []; var w; var l; var area; var k; function preload() { table = loadStrings('698.edges'); } class Edge{ constructor(id1, id2){ this.id1 = id1; this.id2 = id2; } } class Node{ constructor(id, x, y){ this.id = id; this.posx = x; this.posy = y; this.dispx = 0; this.dispy = 0; } } function search(id, nodes){ for(var x = 0; x < nodes.length; x++){ if(nodes[x].id == id){ return nodes[x] } } return 0; } function attraction(d){ return (d*d)/k; } function repulsion(d){ return (k*k)/d; } function setup() { createCanvas(1000, 500); var v = table.length; console.log(v) w = 900; l = 400; area = w*l; for(var x = 0; x < table.length; x++){ edgeInfo = table[x].split(" "); var e = new Edge(parseInt(edgeInfo[0]), parseInt(edgeInfo[1])); edges.push(e); console.log(e.id1); var result1 = search(parseInt(edgeInfo[0]), nodes); var result2 = search(parseInt(edgeInfo[1]), nodes); if(result1 == 0){ var node = new Node(parseInt(edgeInfo[0]), Math.random()*w,Math.random()*l) nodes.push(node); } if(result2 == 0){ var node = new Node(parseInt(edgeInfo[1]), Math.random()*w,Math.random()*l) nodes.push(node); } } k = Math.sqrt(area/Math.abs(nodes.length)); } function draw(){ clear() for(var x = 0; x < nodes.length; x++){ fill(0, 0, 102) var node = nodes[x] ellipse(node.posx, node.posy ,15 ,15); } edges.forEach(function(e,i){ fill(0,0,0) var node_1 = search(e.id1,nodes) var node_2 = search(e.id2,nodes) line(node_1.posx, node_1.posy, node_2.posx, node_2.posy); }) for(var x = 0; x < nodes.length; x++){ var node = nodes[x] if(mouseX < node.posx+8 && mouseX > node.posx-8 && mouseY < node.posy+8 && mouseY > node.posy-8){ fill(0, 2, 252) ellipse(node.posx, node.posy ,15 ,15); fill(192,192,192) rect(mouseX+10, mouseY-(50), 75, 25) fill(0,0,0) textSize(10); text("Node: " + node.id, mouseX+15, mouseY-(40)) } } for(var x = 1; x < 50; x++){ nodes.forEach(function(n1,q){ n1.dispx = 0; n1.dispy = 0; nodes.forEach(function(n2,j){ if(n1 != n2){ var diffx = n1.posx - n2.posx; var diffy = n1.posy - n2.posy; if(diffx != 0){ n1.dispx = n1.dispx + (diffx/ Math.abs(diffx))*repulsion(Math.abs(diffx)) } if(diffy != 0){ n1.dispy = n1.dispy + (diffy/Math.abs(diffy))*repulsion(Math.abs(diffy)) } } }) }) edges.forEach(function(e1,k){ var v = search(e1.id1, nodes) var u = search(e1.id2, nodes) var e_diffx = v.posx - u.posx var e_diffy = v.posy - u.posy if(e_diffx != 0){ v.dispx = v.dispx - (e_diffx/Math.abs(e_diffx))*attraction(Math.abs(e_diffx)) u.dispx = u.dispx + (e_diffx/Math.abs(e_diffx))*attraction(Math.abs(e_diffx)) } if(e_diffy != 0 ){ v.dispy = v.dispy - (e_diffy/Math.abs(e_diffy))*attraction(Math.abs(e_diffy)) u.dispy = u.dispy + (e_diffy/Math.abs(e_diffy))*attraction(Math.abs(e_diffy)) } }) nodes.forEach(function(n,l){ n.posx = n.posx + (n.dispx/Math.abs(n.dispx)) n.posy = n.posy + (n.dispy/Math.abs(n.dispy)) n.posx = Math.min(w*40,Math.max(20, n.posx)) n.posy = Math.min(l*10,Math.max(20, n.posy)) }) } }