public void iterate() {
		numberOfCells = 0;
		// On parcourt toutes les cases pour appliquer les règles à chacune
		for (int y = 0; y <= yMax; y++) {
			for (int x = 0; x <= xMax; x++) {
				setActiveSquare(x, y);
				int sum = bool2int(n()) + bool2int(ne()) + bool2int(e()) + bool2int(se()) + bool2int(s()) + bool2int(sw()) + bool2int(w()) + bool2int(nw());

				if (sum == 3 && !isActiveSquareAlive()) {
					makeCellAliveAt(x, y, true);
					numberOfCells++;
				} else if ((sum == 2 || sum == 3) && isActiveSquareAlive()) {
					makeCellAliveAt(x, y, true);
					numberOfCells++;
				} else
					makeCellDieAt(x, y, true);
			}
		}

		// Après avoir parcouru toutes les cases, on effectue le passage à la
		// prochaine génération
		grid = nextGrid;
		nextGrid = new int[xMax + 1][yMax + 1];
		generationNumber++;

		// On calcule la densité pour cette génération
		density = Math.round(100 * (float) numberOfCells / (float) (getWidth() * getHeight()));
		if (density < 0)
			density = 0;
		if (density > 100)
			density = 100;

		// Et on enregistre ce point de densité dans le tableau qui en garde la
		// trace
		densityPoints.ensureCapacity(generationNumber + 5);
		densityPoints.add(String.valueOf(density));
	}