var canvas_matrix; var canvas; var table_edges; var rangeW,rangeH; var k; var temperature; var circle; var graph; var Graph = function() { this.nodes = {}; this.pos_old ={}; this.pos = {}; this.disp = {}; }; function preload(){ table_edges = loadTable('414.edges', 'tsv'); } function setup() { graph = new Graph(); for(var i=0;i val2){ return val1; } return val2; } function draw(){ background(255); push(); textStyle(BOLD); textSize(24); text("The Force-Directed Layout",canvas_matrix.position,canvas_matrix.position); pop() for (var v in graph.nodes){ graph.addDisp(v,0,0); for(var u in graph.nodes){ if(u!=v){ var delta = magnitude(v,u); if(delta <= 0){ delta = 0.00001; } var dx = graph.pos[v][0] - graph.pos[u][0]; var dy = graph.pos[v][1] - graph.pos[u][1]; graph.disp[v][0] += (dx/delta) * (fr(delta)); graph.disp[v][1] += (dy/delta) * (fr(delta)); } } } for(var i=0;i< table_edges.getRowCount();i++){ var arr = table_edges.getString(i,0).split(' '); var v= arr[0]; var u = arr[1]; var delta = magnitude(v,u); if(delta<=0){ delta = 0.00001; } var dx = graph.pos[v][0] - graph.pos[u][0]; var dy = graph.pos[v][1] - graph.pos[u][1]; graph.disp[v][0] -= (dx/delta)*(fa(delta)); graph.disp[v][1] -= (dy/delta)*(fa(delta)); graph.disp[u][0] += (dx/delta)*(fa(delta)); graph.disp[u][1] += (dy/delta)*(fa(delta)); push(); strokeWeight(0.3); line(graph.pos[v][0]+canvas_matrix.position,graph.pos[v][1]+canvas_matrix.position,graph.pos[u][0]+canvas_matrix.position,graph.pos[u][1]+canvas_matrix.position); pop(); push(); noStroke(); fill('rgb(191, 63, 138)'); ellipse(graph.pos[v][0]+canvas_matrix.position,graph.pos[v][1]+canvas_matrix.position, circle.r,circle.r); pop(); var d = dist(mouseX,mouseY,graph.pos[v][0]+canvas_matrix.position,graph.pos[v][1]+canvas_matrix.position); if(d <= circle.r){ push(); textSize(16); stroke(255); textStyle(BOLD); text(arr[0],graph.pos[v][0]+canvas_matrix.position+10,graph.pos[v][1]+canvas_matrix.position+10); text(arr[1],graph.pos[u][0]+canvas_matrix.position+10,graph.pos[u][1]+canvas_matrix.position+10); pop(); push(); strokeWeight(1); stroke(0) line(graph.pos[v][0]+canvas_matrix.position,graph.pos[v][1]+canvas_matrix.position,graph.pos[u][0]+canvas_matrix.position,graph.pos[u][1]+canvas_matrix.position); pop(); } } for(var v in graph.nodes){ var dx = graph.pos[v][0]; var dy = graph.pos[v][1]; var magnitude_disp = Math.sqrt(dx*dx + dy*dy)*10; if(magnitude_disp <= 0){ magnitude_disp = 0.00001; } graph.pos[v][0] += (graph.disp[v][0]/magnitude_disp) * findMin(magnitude_disp,temperature); graph.pos[v][1] += (graph.disp[v][1]/magnitude_disp) * findMin(magnitude_disp,temperature); graph.pos[v][0] = findMin(graph.pos_old[v][0], findMax(50, graph.pos[v][0])); graph.pos[v][1] = findMin(graph.pos_old[v][1], findMax(50, graph.pos[v][1])); } temperature -= cooldown; if (temperature < cooldown){ temperature = 0; } print(cooldown); print(temperature); }