rendered paste body 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();