/* 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