Return to menu
/*

   A surface filled with one hundred medium to small sized circles.
   Each circle has a different size and direction, but moves at the same slow rate.
   Display:
   A. The instantaneous intersections of the circles
   >>> B. The aggregate intersections of the circles

   Implemented by J. Tarbell <http://levitated.net>
   8 April 2004
   Flash MX

   Flash files must be attached to different parts of the Flash
   environment before they will compile. They are presented
   on this page outside their context.

*/


// Code in the first frame of the Timeline

Object.env = this;
numCircle = 100;
circles = new Array();
numLine = 1000;
cntLine = 0;

function pushLine(aX, aY, bX, bY, a) {
	var nombre = "pline"+String(cntLine);
	var init = {_x:aX,_y:aY,_xscale:bX-aX,_yscale:bY-aY,_alpha:a};
	this.attachMovie("pline",nombre,200+cntLine,init);
	if (cntLine++>numLine) {
		cntLine=0;
	}
}

for(var i=0; i<numCircle; i++) {
	var nombre = "circle"+String(i);
	var init = {_x:Math.random()*Stage.width,_y:Stage.height*i/numCircle,r:10+Math.random()*50,sp:Math.random()-Math.random(),ysp:Math.random()-Math.random(),id:i};
	var neo = this.attachMovie("circle",nombre,i,init);
	this.circles.push(neo);
}

this.onEnterFrame = function() {
	cnt++;
	if (cnt%2==0) {
		for(var i=0; i<numCircle; i++) {
		  circles[i].update();
 	 }
	}
  for(var i=0; i<numCircle; i++) {
    circles[i].move();
  }
}
stop();


// Code associated with the circle Movie Clip

#initclip
// constructor
function Circle() {
	this.r2 = this.r*this.r;
}

// allow component to inherit MovieClip properties
Circle.prototype = new MovieClip();

// instance methods
Circle.prototype.update = function() {
  for (var i=this.id+1; i<Object.env.numCircle; i++) {
    this.intersect(Object.env.circles[i]);
  }
};
Circle.prototype.makepoint = function() {
	// not required, point exists as graphic in movieclip
};
Circle.prototype.move = function() {
  this._x += this.sp;
  this._y += this.ysp;
  if(this.sp > 0) {
    if(this._x > Stage.width+this.r) {
      this._x = -this.r;
    }
  } else {
    if(this._x < -this.r) {
      this._x = Stage.width+this.r;
    }
  }
  if(this.ysp > 0) {
    if(this._y > Stage.height+this.r) {
      this._y = -this.r;
    }
  } else {
    if(this._y < -this.r) {
      this._y = Stage.height+this.r;
    }
  }
};
Circle.prototype.intersect = function( cB ) {
	var cA = this;

  var dx = cA._x - cB._x;
  var dy = cA._y - cB._y;
  var d2 = dx*dx + dy*dy;
  var d = Math.sqrt(d2);

  if ( d>cA.r+cB.r || d<Math.abs(cA.r-cB.r) ) {
    return; // no solution
  }
  var a = (cA.r2 - cB.r2 + d2) / (2*d);
  var h = Math.sqrt( cA.r2 - a*a );
  var x2 = cA._x + a*(cB._x - cA._x)/d;
  var y2 = cA._y + a*(cB._y - cA._y)/d;

  var paX = x2 + h*(cB._y - cA._y)/d;
  var paY = y2 - h*(cB._x - cA._x)/d;
  var pbX = x2 - h*(cB._y - cA._y)/d;
  var pbY = y2 + h*(cB._x - cA._x)/d;

	var dist = Math.sqrt((paX-pbX)*(paX-pbX)+(paY-pbY)*(paY-pbY));
	Object.env.pushLine(paX,paY,pbX,pbY,dist*0.587);
};

// Connect the class with the linkage ID for this movie clip
Object.registerClass("circle", Circle);
#endinitclip