var table; function preload() { table = loadTable('3980.edges', 'edges'); } var width = 800.0; var length = 800.0; var vMap = new Map(); var eList = new Array(); var area = width * length; var maxIter = 20; var temp; function setup() { createCanvas(800, 800); // noLoop(); temp = width/10; var firstColumn = table.getColumn(0); var secondColumn = table.getColumn(1); // frameRate(100); firstColumn.forEach(function(row, index) { var row = firstColumn[index].toString().split(" "); var firstNode = row[0]; var secondNode = row[1]; // add vertices into vMap if(vMap.get(firstNode) == null){ // (Math.random() * 10) + 1 var randomX = (Math.random() * (width-200)); var randomY = (Math.random() * (length-200)) ; var vArray = new Array(); vArray[0] = new Array(randomX, randomY); vArray[1] = new Array(); vMap.set(firstNode, vArray); } // add second vertices if(vMap.get(firstNode) == null){ var randomX = (Math.random() * (width-200)); var randomY = (Math.random() * (length-200)); var vArray = new Array(); vArray[0] = new Array(randomX, randomY); vArray[1] = new Array(); vMap.set(secondNode, vArray); } var epair = new Array(firstNode, secondNode); eList.push(epair); }); } /* Ref: vMap.get(nodeId)[0] = [x, y]; vMap.get(nodeId)[1] = [dx, dy]; */ function draw(){ background(255); fill(0); noStroke(); textSize(20); text('Social Network Node-Link', 300, 20); var xnull = 0; var ynull = 0; textSize(10); var k = Math.sqrt(area / (vMap.size)); for(var curIndex = 0; curIndex < maxIter ; curIndex++){ for(let [v, val] of vMap){ vMap.get(v)[1][0] = 0.0; vMap.get(v)[1][1] = 0.0; for(let [u, val] of vMap){ if(v != u){ // v.x - u.x; var xDist = vMap.get(v)[0][0] - vMap.get(u)[0][0]; var yDist = vMap.get(v)[0][1] - vMap.get(u)[0][1]; var dist = Math.sqrt(xDist * xDist + yDist * yDist); var xrepulsiveF = k * k / xDist; var yrepulsiveF = k * k / yDist; if(xDist === 0){ xDist = 0.01; } if(yDist === 0){ yDist = 0.01; } if(xDist > 0 && yDist >0){ vMap.get(v)[1][0] += (xDist / Math.abs(xDist)) * repulsiveF; vMap.get(v)[1][1] += (yDist / Math.abs(yDist)) * repulsiveF; } } } } for(var j = 0; j < eList.length; j++){ var vId = eList[j][0]; // v id var uId = eList[j][1]; vMap.get(vId); var xDist = vMap.get(vId)[0][0] - vMap.get(uId)[0][0]; // e.v.pos - e.u.pos var yDist = vMap.get(vId)[0][1] - vMap.get(uId)[0][1]; var dist = Math.sqrt(xDist * xDist + yDist * yDist); var repulsiveF = k * k / dist; var xattractiveF = xDist * xDist / k; var yattractiveF = yDist * yDist / k; if(xDist === 0){ xDist = 0.01; } if(yDisp === 0){ yDist = 0.01; } if(xDist > 0 && yDist >0){ vMap.get(vId)[1][0] -= xDist / Math.abs(xDist) * xattractiveF; vMap.get(vId)[1][1] -= yDist / Math.abs(yDist) * yattractiveF; vMap.get(uId)[1][0] += xDist / Math.abs(xDist) * xattractiveF; vMap.get(uId)[1][1] += yDist / Math.abs(yDist) * yattractiveF; } // print("bruh"); } var sumDist = 0; for(let [v, val] of vMap){ var xDisp = Math.abs(vMap.get(v)[1][0]) ; var yDisp = Math.abs(vMap.get(v)[1][1]); var dist = Math.sqrt(xDist * xDist + yDist * yDist); if(xDisp === 0){ // print("xDisp: " + xDisp); xDisp = 0.01; } if(yDisp === 0){ yDisp = 0.01; } if(xDisp > 0 && yDisp >0){ sumDist += dist; vMap.get(v)[0][0] += xDisp / Math.abs(xDisp) * Math.min(vMap.get(v)[1][0], temp); // x pos vMap.get(v)[0][1] += yDisp / Math.abs(yDisp) * Math.min(vMap.get(v)[1][1], temp); // y pos vMap.get(v)[0][0] = Math.min(width - 50 , Math.max(50.0, vMap.get(v)[0][0])); vMap.get(v)[0][1] = Math.min(length - 50 , Math.max(50.0, vMap.get(v)[0][1])); } } temp *= (1.0 - curIndex / maxIter); }// big for // draw nodes fill(0); for(let [v, val] of vMap){ ellipse(vMap.get(v)[0][0], vMap.get(v)[0][1], 12, 12); if( mouseX > vMap.get(v)[0][0] - 10 && mouseY < vMap.get(v)[0][1] + 10 && mouseX < vMap.get(v)[0][0] + 10 && // right boundary mouseY > vMap.get(v)[0][1] - 10 ) { text(v, mouseX, mouseY-3); } } // draw lines for(var j = 0; j < eList.length; j++){ var vId = eList[j][0]; // v id var uId = eList[j][1]; stroke('#FF0000'); line(vMap.get(vId)[0][0], vMap.get(vId)[0][1], vMap.get(uId)[0][0], vMap.get(uId)[0][1]); } }