var edges; var dict = {} var position = {}; var numVertices = 0; function preload() { edges = loadTable('3980.csv', 'csv'); name = "3980.edges"; } function setup() { for(var r = 0; r < edges.getRowCount(); r++) { var v1 = edges.getNum(r,0); var v2 = edges.getNum(r,1); var min = 100; var max = 800; if(v1 in dict) { append(dict[v1], v2); } else { var v1_initx = Math.floor(Math.random() * (max - min + 1)) + min; var v1_inity = Math.floor(Math.random() * (max - min + 1)) + min; dict[v1] = [v2] position[v1] = [v1_initx, v1_inity, 0, 0];//indices 2 and 3 are saved for displacement } //add edge both ways because it's undirected if(v2 in dict) { append(dict[v2], v1); } else { //add initial position to index 0 and 1 of array var v2_initx = Math.floor(Math.random() * (max - min + 1)) + min; var v2_inity = Math.floor(Math.random() * (max - min + 1)) + min; dict[v1] = [v2]; position[v2] = [v2_initx, v2_inity, 0, 0]; //indices 2 and 3 are saved for displacement } } //Count number of vertices for(key in dict) { numVertices++; } createCanvas(1000, 1000); } function draw() { clear(); var area = 1000*1000; k = (area/numVertices)**.5; textSize(30); fill(0, 153, 204); text("Force Directed", 800, 50); for(v1 in dict) { var dispx = 0; var dispy = 0; position[v1][2] = 0; position[v1][3] = 0; for(v2 in dict) { if(v1 != v2) { var deltax = position[v1][0] - position[v2][0]; var deltay = position[v1][1] - position[v2][1]; if(deltax != 0) { dispx = position[v1][2] + (deltax/abs(deltax))*(k*k/abs(deltax)); } if(deltay != 0) { dispy = position[v1][3] + (deltay/abs(deltay))*(k*k/abs(deltay)); } position[v1][2] = dispx; position[v1][3] = dispy; } } } for(v1 in dict) { //hold up what's the purpose of this? -- more displacements! now it's in the dictionary for(i = 0; i < dict[v1].length; i++) { var v = dict[v1][i]; for(v2 in dict) { //print("here"); if(v == v2) { var delta_x = int(position[v1][0] - position[v2][0]); var delta_y = int(position[v1][1] - position[v2][1]); var v1x_edgedisp = 0; var v1y_edgedisp = 0; var v2x_edgedisp = 0; var v2y_edgedisp = 0; if(delta_x != 0) { v1x_edgedisp = position[v1][2] - (delta_x/abs(delta_x)) * (abs(delta_x*delta_x)/k); v2x_edgedisp = position[v2][2] + (delta_x/abs(delta_x)) * (abs(delta_x*delta_x)/k); } if(delta_y != 0) { v1y_edgedisp = position[v1][3] - (delta_y/abs(delta_y)) * (abs(delta_y*delta_y)/k); v2y_edgedisp = position[v2][3] + (delta_y/abs(delta_y)) * (abs(delta_y*delta_y)/k); } position[v1][2] = v1x_edgedisp; position[v1][3] = v1x_edgedisp; position[v2][2] = v2x_edgedisp; position[v2][3] = v2y_edgedisp; } } } } for(v1 in dict) { var x_pos = position[v1][0]; var y_pos = position[v1][1];; if(position[v1][2] != 0) { x_pos = x_pos + (position[v1][2]/abs(position[v1][2])); } if(position[v1][3] != 0) { y_pos = y_pos + (position[v1][3]/abs(position[v1][3])); } x_pos = min(900, max(10, x_pos)); y_pos = min(900, max(10, y_pos)); position[v1][0] = x_pos; position[v1][1] = y_pos; fill(0, 153, 204); ellipse(position[v1][0], position[v1][1], 20, 20); for(i = 0; i < dict[v1].length; i++) { //print("here what up"); var v2 = dict[v1][i]; fill(0); line(position[v1][0], position[v1][1], position[v2][0], position[v2][1]); if(dist(position[v1][0], position[v1][1], mouseX, mouseY) < 5) { textSize(20); text("Vertex: " + v1, 800, 90); } } } }