/*
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 =t his.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