The forums have permanently moved to forum.kirupa.com. This forum will be kept around in read-only mode for archival purposes. To learn how to continue using your existing account on the new forums, check out this thread.

# Thread: Experimenting with recursive objects to make fractals

1. 17
posts
Registered User

## Experimenting with recursive objects to make fractals

I've been mucking around with recursive objects (objects that upon instantiation create a new instance of themselves, in this case the instance is a child) to create a fractal generator. It works by creating a single instance of the branch class, which then results in the creation of the entire fractal via recursion based on some global parameters and limits to stop infinite recursion. The result is basically some cool patterns: http://morefigs.net/flash-fractal-generator/

The source for the Branch class is:

Code:
```package fractal.assets {

import flash.display.Sprite;
import fractal.global.Globals;

public class Branch extends Sprite {

// CONSTRUCTOR
public function Branch(len:Number, rot:Number, col:uint):void {

rotation = rot;

// iterate global branch count
Globals.instance.branchCount += 1;

// draw self
graphics.lineStyle(1, col);
graphics.moveTo(0, 0);
graphics.lineTo(0, len);

// soft ends effect, alpha is cumulative via parents
if (len < 20) {
alpha = 0.95;
}

var kidBranchColor:uint = col;

// work out randomised color if needed

// read off r g b channels from col unsigned integer
var r:int = ( col >> 16 ) & 0xFF
var g:int = ( col >> 8 ) & 0xFF;
var b:int = col & 0xFF;

// add a random positive or negative drift to the r g b channels
r += Math.round((Math.random() - 0.5) * Globals.instance.colorSpread);
g += Math.round((Math.random() - 0.5) * Globals.instance.colorSpread);
b += Math.round((Math.random() - 0.5) * Globals.instance.colorSpread);

// ...with limits
if (r < 0) { r = 0 } else if (r > 255) { r = 255 };
if (g < 0) { g = 0 } else if (g > 255) { g = 255 };
if (b < 0) { b = 0 } else if (b > 255) { b = 255 };

// convert the r g b channels back to an unsigned integer
kidBranchColor = ( r << 16 ) | ( g << 8 ) | b;
}

makeKids(len, kidBranchColor);

}

// make child branches
private function makeKids(len:Number, col:uint):void {

for (var i:int = 0; i < Globals.instance.prob.length; i++) {

// if global limits not reached and probability of children is high enough
if ((Globals.instance.prob[i] > Math.random()) && (Globals.instance.branchCount < Globals.instance.maxBranches) && (len > Globals.instance.minLength)) {

addChild(new Branch(len * (Globals.instance.lengthFactor[i] + (Math.random() - 0.5) * Globals.instance.lengthFactorSpread * 2), (Math.random() - 0.5) * Globals.instance.angleBiasSpread * 2 + Globals.instance.angleBias[i], col));
getChildAt(numChildren - 1).y = len;
}
}
}

// null all child branches
public function nullKids():void {

while (numChildren > 0) {
var child:Branch = getChildAt(0) as Branch;
child.nullKids();
removeChild(child);
child = null;
}
}
}
}```

2. 17
posts
Registered User
You gotta make em