Статья по теме:
Демо JavaScript:
<canvas height="1000" width='1000' id='cnvs'></canvas><br /> <input type="button" onclick="draw()" value="Пуск"> <script> var ctx, imgData, canvas; var color = {r: 54, g: 163, b: 116 , a: 255}; // цвет папоротника canvas = document.getElementById("cnvs"); ctx = canvas.getContext("2d"); function setPixel (x,y,c) // устанавливает пиксель с координатой (x, y) с цветом c { var index = 4*(x + canvas.width*y); imgData.data[index + 0]=c.r; imgData.data[index + 1]=c.g; imgData.data[index + 2]=c.b; imgData.data[index + 3]=c.a; return c; } function draw() { imgData = ctx.createImageData(1000, 1000); ctx.putImageData(imgData, 0, 0); var iterationCount = 500000; // количество итераций var p, oldx; var r = 80; // коэффициент размера // координаты точки x = 1.0; y = 0.0; while(iterationCount > 0) { p = Math.random(); // генерируем случайное число от 0 до 1 (вероятность) oldx = x; // запоминаем старое значение х if(p <= 0.85) // верхняя часть { x = 0.85 * x + 0.04 * y; y = -0.04 * oldx + 0.85 * y + 1.6; } else { if(p <= 0.92) // левый лист { x = 0.25 * x - 0.26 * y; y = 0.23 * oldx + 0.25 * y + 1.6; } else if(p <= 0.99) // правый лист { x = -0.15 * x + 0.3 * y; y = 0.26 * oldx + 0.2 * y + 0.44; } else // стебель { x = 0.0; y = 0.16 * y; } } // ставим пиксель, сдвигаем его в центр setPixel(400 + Math.round(r * x), 850 - Math.round(r * y), color); iterationCount--; } ctx.putImageData(imgData, 0, 0); } </script>