http://www.demiart.ru/forum/index.php?showtopic=61956
Можно и на AS3

Код:
package {
import flash.display.*;
import flash.events.*;
dynamic public class TreeDoc extends Sprite{ ;//класс наследник спрайта
public var branchSize:Number;
public var branchCounter:int;
public var i:int;
public function TreeDoc() {//конструктор
// Параметры дерева
branchSize = 100;
branchCounter = 0;
new Branch(this, 300,300);
}
public function newBranch(_x:int, _y:int) {
branchSize = branchSize-0.1;
if (branchSize<10) branchSize =10;
for (i=0;i<Math.random()*40;i++)
if (branchCounter<100) new Branch(this, _x, _y);
}
}
}
import flash.display.*;
import flash.events.*;
class Branch extends MovieClip {
var doc:TreeDoc;
var endPosAr:Array;
var rad:Number, cosA:Number, sinA:Number;
var timeP:Array;
function Branch(_doc:TreeDoc,_x:int, _y:int) {
doc = _doc;
doc.addChild(this);
x = _x;
y = _y;
endPosAr = [0,0];
timeP = [0,0];
addEventListener(Event.ENTER_FRAME, enterFr);
}
function enterFr(evt:Event) {
graphics.lineStyle(doc.branchSize/20, 0x000000);//рисуем линию
graphics.moveTo(0, 0);// Устанавливаем начальные кординаты
// Если это не ствол, изменить угол и размер ветви
endPosAr=[doc.branchSize,0];
rotateForCentre([0, 0],endPosAr,Math.random()*180);
graphics.lineTo(endPosAr[0], endPosAr[1]);
this.removeEventListener(Event.ENTER_FRAME, enterFr);
doc.newBranch(x+endPosAr[0], y+endPosAr[1]);
doc.branchCounter++;
}
function rotateForCentre(_centrePoint:Array, _objectPoint:Array, _grad:int) {
rad = (_grad* (Math.PI/180));
cosA = Math.cos(rad);
sinA = Math.sin(rad);
//trace(_objectPoint[0])
timeP[0] = _objectPoint[0] - _centrePoint[0];//x
timeP[1] = _objectPoint[1] - _centrePoint[1];//y
_objectPoint[0] = _centrePoint[0] +
(timeP[0]*cosA + timeP[1]*sinA);
_objectPoint[1] = _centrePoint[1] +
(-timeP[0]*sinA + timeP[1]*cosA);
}
}