Zielony Smok - logo witryny

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

Zawartość możesz zobaczyć w
przeglądarce obsługującej element <canvas>
z kontekstem "2d"



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);