script.coordinateSystem = 'bottom-up'; var values = { startX: (document.size.width / 2), startY: (document.size.height / 8), startAngle: 90, count: 5, divisions: 2, bigness: 100, spreadOverride: true, spread: 60, angleDecay: true, scale: 75, button: 'Generate' } var components = { startX: {type: 'number', label: 'Starting x', units: 'point', length: 10}, startY: {type: 'number', label: 'Starting y', units: 'point', length: 10}, startAngle: {type: 'number', label: 'Starting direction', units: 'degree', range: [0, 360]}, ruler1: {type: 'ruler'}, count: {type: 'number', label: 'Levels', steppers: true, increment: 1}, divisions: {type: 'number', label: 'Divisions', steppers: true, increment: 1}, bigness: {type: 'number', label: 'Initial length', units: 'point'}, ruler2: {type: 'ruler'}, spreadOverride: {type: 'boolean', label: 'Set starting angle'}, spread: {type: 'number', label: 'Starting angle', units: 'degree', range: [0, 360]}, angleDecay: {type: 'boolean', label: 'Decrease successive angles'}, scale: {type: 'number', label: 'Line scaling', units: 'percent'}, ruler3: {type: 'ruler'}, button: {type: 'button', onClick: function(){ drawTree(values.count, new Point(values.startX, values.startY), toRadians(values.startAngle)); } } } function toRadians(a){ return(Math.PI * a / 180); } var spreadAngle; function drawTree(i, myStart, baseAngle){ if(values.spreadOverride == true){ spreadAngle = toRadians(values.spread); }else{ spreadAngle = (Math.PI / values.divisions); } var myLength = (values.bigness * Math.pow(values.scale / 100, values.count - i)); var endX = myStart.x + (Math.cos(baseAngle) * myLength); var endY = myStart.y + (Math.sin(baseAngle) * myLength); var myEnd = new Point(endX, endY); var myLine = new Path.Line(myStart, myEnd); if(i > 1){ var newSpreadAngle; if(values.angleDecay){ newSpreadAngle = spreadAngle * (i / values.count); }else{ newSpreadAngle = spreadAngle; } var myAction = ""; for(j = 0; j < values.divisions; j++){ myAction += "drawTree(i-1, myEnd, (baseAngle - (Math.PI / 2)) + ((Math.PI - (newSpreadAngle * (values.divisions - 1))) / 2) + (newSpreadAngle * " + j + "));\n"; } eval(myAction); } } var palette = new Palette('Fractal tree', components, values);