var total_kinetic_energy = 0.0; var damping = 0.4; var COULOMB_FORCE_CONSTANT = 8987600000 / 10000000; var SPRING_CONSTANT = 0.4; var DEFAULT_SPRING_LENGTH = 10.0; var timestep = 1.0; function coulombRepulsion( nodeA, nodeB ) { var q1 = nodeA._mass; var q2 = nodeB._mass; //trace( q1 + " - " + q2 ); var rx = nodeA._x - nodeB._x; var ry = nodeA._y - nodeB._y; var r2 = rx * rx + ry * ry; var r = Math.sqrt( r2 ); var factor = COULOMB_FORCE_CONSTANT * (q1 * q2) / r2; //trace( factor ); var ret = new Object(); ret._ex = factor * rx / r; ret._ey = factor * ry / r; return ret; } function hookAttraction( nodeA, nodeB ) { var rx = nodeA._x - nodeB._x; var ry = nodeA._y - nodeB._y; var r2 = rx * rx + ry * ry; var r = Math.sqrt( r2 ); var elongated = -DEFAULT_SPRING_LENGTH + r; var ret = new Object(); ret._ex = -SPRING_CONSTANT * elongated * rx / r; ret._ey = -SPRING_CONSTANT * elongated * ry / r; return ret; } for ( var i = 0; i < factionNodes.length; i++ ) { factionNodes[i]._ex = 0.0; factionNodes[i]._ey = 0.0; for ( var j = 0; j < factionNodes.length; j++ ) { if ( j == i ) continue; var net_force = coulombRepulsion( factionNodes[i], factionNodes[j] ); //trace( net_force._ex + " & " + net_force._ey ); factionNodes[i]._ex = factionNodes[i]._ex + net_force._ex; factionNodes[i]._ey = factionNodes[i]._ey + net_force._ey; //trace( factionNodes[i]._ex + " / " + factionNodes[i]._ey ); } for ( var j = 0; j < factionNodes[i].parentCount(); j++ ) { for ( var k = 0; k < factionNodes.length; k++ ) { if ( factionNodes[k].nodeid == factionNodes[i].getParentId( j ) ) { var net_force = hookAttraction( factionNodes[i], factionNodes[k] ); //trace( net_force._ex + " & " + net_force._ey ); factionNodes[i]._ex = factionNodes[i]._ex + net_force._ex; factionNodes[i]._ey = factionNodes[i]._ey + net_force._ey; break; } } } //trace( factionNodes[i]._ex + " / " + factionNodes[i]._ey ); factionNodes[i]._dx = (factionNodes[i]._dx + timestep * factionNodes[i]._ex) * damping; factionNodes[i]._dy = (factionNodes[i]._dy + timestep * factionNodes[i]._ey) * damping; total_kinetic_energy += factionNodes[i].velocity(); //trace( total_kinetic_energy ); if ( factionNodes[i].root ) { factionNodes[i]._dx = 0.0; factionNodes[i]._dy = 0.0; } factionNodes[i]._x += factionNodes[i]._dx * timestep; factionNodes[i]._y += factionNodes[i]._dy * timestep; } if ( total_kinetic_energy < 0.25 ) gotoAndStop( 10 ); //stop();