{Software} Structures

/* 
   
   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(); 
 
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() { 
  this.clear(); 
  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.lineStyle(0,0x000000,dist*1.587); 
  Object.env.moveTo(paX,paY); 
  Object.env.lineTo(pbX,pbY); 
}; 
 
// Connect the class with the linkage ID for this movie clip 
Object.registerClass("circle", Circle); 
#endinitclip