Drzewo Feigenbauma
O chaosie deterministycznym możesz przeczytać w rozdziale 25 książki Matematyka dla programistów Java oraz w rozdziale 22 książki Matematyka dla programistów JavaScript.
Strona używa skryptów ax.js oraz rzutowanie.js
Listing
var setPixel = function(data, iwidth, x, y, r, g, b, a){ data[((iwidth * y) + x) * 4] = r; data[((iwidth * y) + x) * 4 + 1] = g; data[((iwidth * y) + x) * 4 + 2] = b; data[((iwidth * y) + x) * 4 + 3] = a; }; var randomInRange = function(min, max) { var random = -1; if (min > max) { return new Error('Pierwsza liczba musi być mniejsza od drugiej'); } else { random = cutDecimal(Math.floor(Math.random() * (max - min + 1)) + min); } return random; }; var cutDecimal = function(nr) { var temp = nr.toString(); var temp1 = temp.indexOf("."); var temp2 = ""; if (temp1 > -1) { temp2 = temp.substr(0, temp1); } else { temp2 = temp; } return parseInt(temp2); }; var cv = document.getElementById('canvas'); var ctx = cv.getContext('2d'); var width = cv.width; var height = cv.height; var offset=30; ctx.fillStyle="white"; ctx.fillRect(offset, offset, width - 2 * offset, height - 2 * offset); var diag1 = new Ax(0, 0, width - 2 * offset, height - 2 * offset, 0, 0, 4, 1, 0.5, 0.25, offset); diag1.drawGrid("lightgray"); ctx.fillStyle="black"; diag1.drawTitle("Liczebność populacji w zależności od wartości r", 15); diag1.drawXLegend(15); diag1.drawYLegend(15); ctx.fillText("r", 840, 855); ctx.fillText("N/K - nasycenie populacji", 5, 12); var imageData = ctx.getImageData(offset, offset, width - 2 * offset, height - 2 * offset); var data = imageData.data; var b = diag1.rh; var r = 0.0; var dt = 1.0; for(var x = 0; x < width - 2 * offset; x++){ r = diag1.rzut.getRX(x); for(var i = 0; i < 500; i++){ var N = (1.0 + randomInRange(0, 999)) / 1000.0; for(var t = 0; t < 500; t += dt){ N = N * r * (1 - N); } var y = cutDecimal(diag1.rzut.getSY(b - N)); setPixel(data, width-2 * offset,x,y,0,0,0,255); } } ctx.putImageData(imageData,0+offset,0+offset);