var table; var node = []; // vertices array var k; var area; var addNode0; var addNode1; var edge = []; // edges array var W = 500; var L = 500; var t = W/2; // temperature initial value function preload() { // my table is comma separated value "csv“ table = loadTable('0-new.edges', 'csv'); } function setup() { //count the columns print("Hello!"); print(table.getRowCount() + ' total rows in table'); print(table.getColumnCount() + ' total columns in table'); // cycle through the table for (var r = 0; r < table.getRowCount(); r++) { // fill in edges array, to store all edges (two nodes) nx = new Edge(); nx.value0 = table.getNum(r, 0); nx.value1 = table.getNum(r, 1); edge.push(nx); // fill in nodes array, to store all vertices addNode0 = 1; addNode1 = 1; for (var s = 0; s < node.length; s++) { if (node[s].value == table.getNum(r, 0)) addNode0 = 0; if (node[s].value == table.getNum(r, 1)) addNode1 = 0; } if (addNode0 == 1) { n0 = new Node(); n0.x = Math.random()*W; n0.y = Math.random()*L; n0.disp_x = 0; n0.disp_y = 0; n0.setValue(table.getNum(r, 0)); node.push(n0); } if (addNode1 == 1) { n1 = new Node(); n1.x = Math.random()*W; n1.y = Math.random()*L; n1.disp_x = 0; n1.disp_y = 0; n1.setValue(table.getNum(r, 1)); node.push(n1); } } createCanvas(1000, 1000); // calculate some parameters area = W*L; k = sqrt(area/node.length); print("area = " + area); print("k = " + k); print("node.length = " + node.length); print("edge.length = " + edge.length); // do iterations by i for (var i = 1; i < 5; i++) { // calculate repulsive forces for (var s = 0; s < node.length; s++) { node[s].disp_x = 0; node[s].disp_y = 0; for (var t = 0; t < node.length; t++) { if (node[s].value != node[t].value) { dis = dist(node[s].x, node[s].y, node[t].x, node[t].y); if (dis == 0) dis = 0.000001; var delta_x = node[s].x - node[t].x; var delta_y = node[s].y - node[t].y; node[s].disp_x = node[s].disp_x + (delta_x/abs(dis))*((k*k)/abs(dis)); node[s].disp_y = node[s].disp_y + (delta_y/abs(dis))*((k*k)/abs(dis)); } } } // calculate attractive forces for (var e = 0; e < edge.length; e++) { for (var s = 0; s < node.length; s++) { for (var t = 0; t < node.length; t++) { if (node[s].value == edge[e].value0 && node[t].value == edge[e].value1) { dis2 = dist(node[s].x, node[s].y, node[t].x, node[t].y); if (dis2 == 0) dis2 = 0.000001; var delta_x = node[s].x - node[t].x; var delta_y = node[s].y - node[t].y; node[s].disp_x = node[s].disp_x - (delta_x/abs(dis2))*((dis2*dis2)/k); node[s].disp_y = node[s].disp_y - (delta_y/abs(dis2))*((dis2*dis2)/k); node[t].disp_x = node[t].disp_x + (delta_x/abs(dis2))*((dis2*dis2)/k); node[t].disp_y = node[t].disp_y + (delta_y/abs(dis2))*((dis2*dis2)/k); } } } } // limit max disp to temperature t and prevent from disp outside frame for (var s = 0; s < node.length; s++) { dis3 = sqrt(node[s].disp_x*node[s].disp_x+node[s].disp_y*node[s].disp_y); if (dis3 == 0) dis3 = 0.000001; node[s].x = node[s].x + (node[s].disp_x/abs(dis3))*min(dis3, t)*0.4; node[s].y = node[s].y + (node[s].disp_y/abs(dis3))*min(dis3, t)*0.4; if (node[s].x < 50) node[s].x = 70; if (node[s].x > 800) node[s].x = 800; if (node[s].y < 50) node[s].y = 70; if (node[s].y > 800) node[s].y = 800; } // reduce the temperature t = ((4-i)/4)*t; } } function draw(){ background(255); translate(50, 50); strokeWeight(1); // draw all edges for (var e = 0; e < edge.length; e++) { for (var s = 0; s < node.length; s++) { for (var t = 0; t < node.length; t++) { if (node[s].value == edge[e].value0 && node[t].value == edge[e].value1) { stroke(color(192, 192, 192)); strokeWeight(1); line(node[s].x, node[s].y, node[t].x, node[t].y); } } } } // draw all vertices for (var s = 0; s < node.length; s++) { stroke(color(0, 0, 255)); strokeWeight(8); point(node[s].x, node[s].y); // hover if (dist(mouseX-50, mouseY-50, node[s].x, node[s].y) < 10) { noStroke(); fill('red'); textStyle(BOLD); textAlign(CENTER); textSize(25); text(node[s].value, mouseX-50, mouseY-50); } } } // Node structure, to store all vertices function Node() { this.value; this.x; this.y; this.disp_x; this.disp_y; this.setValue = function(v) { this.value = v; }; } // Edge structure, to store all edges (two nodes) function Edge() { this.value0; this.value1; }