All pastes #460204 Raw Edit

Someone

public text v1 · immutable
#460204 ·published 2007-04-26 22:25 UTC
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();