From 5700bc5346899481c4a0d838511da30e6cca0a15 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 4 Apr 2011 17:34:21 +0200 Subject: [PATCH] Do not redraw all cells. --- jeudelavie/jeudelavie.cpp | 112 ++++++++++++++++++++++++-------------- 1 file changed, 72 insertions(+), 40 deletions(-) diff --git a/jeudelavie/jeudelavie.cpp b/jeudelavie/jeudelavie.cpp index 8f3ae87..b78fb0d 100644 --- a/jeudelavie/jeudelavie.cpp +++ b/jeudelavie/jeudelavie.cpp @@ -2,64 +2,94 @@ #include #include -#define LARGEUR 213 -#define HAUTEUR 160 +#define LARGEUR 1200 +#define HAUTEUR 900 -#define TCELL 5 // taille d'une cellule - -#define BORDURE 0x00000000U // noir +#define BORDURE 0x00ffffffU // blanc #define NAISSANT 0x0000ff00U // vert #define VIVANT 0x000000ffU // bleu #define MOURANT 0x00ff0000U // rouge #define MORT 0x00ffffffU // blanc -bool cells[LARGEUR][HAUTEUR][2]; +struct cell { + int neigh; + bool now; + bool next; +}; +cell cells[LARGEUR][HAUTEUR]; -void init() +void majVoisins(int i, int j, int delta) { - srand(time(NULL)); - for (int i = 0 ; i < LARGEUR ; ++i) - for (int j = 0 ; j < HAUTEUR ; ++j) - cells[i][j][0] = cells[i][j][1] = (rand() < RAND_MAX / 2); + for (int k = i - 1 ; k <= i + 1 ; ++k) + for (int l = j - 1 ; l <= j + 1 ; ++l) + if (k != i || l != j) { + int vi = (k + LARGEUR) % LARGEUR; + int vj = (l + HAUTEUR) % HAUTEUR; + cells[vi][vj].neigh += delta; + } +} + +void dessine(DrawingWindow& w, int i, int j, unsigned couleur) +{ + w.setColor(couleur); + w.drawPoint(i, j); } -void draw(DrawingWindow& w) +void init(DrawingWindow& w) { + srand(time(NULL)); + for (int i = 0 ; i < LARGEUR ; ++i) + for (int j = 0 ; j < HAUTEUR ; ++j) + cells[i][j].neigh = 0; for (int i = 0 ; i < LARGEUR ; ++i) for (int j = 0 ; j < HAUTEUR ; ++j) { - if (cells[i][j][0] == cells[i][j][1]) - w.setColor(cells[i][j][1] ? VIVANT : MORT); - else - w.setColor(cells[i][j][1] ? NAISSANT : MOURANT); - w.fillRect(TCELL * i + 1, TCELL * j + 1, - TCELL * (i + 1) - 1, TCELL * (j + 1) - 1); - cells[i][j][0] = cells[i][j][1]; + cells[i][j].next = (rand() < RAND_MAX / 2); + cells[i][j].now = !cells[i][j].next; + if (cells[i][j].now) { + majVoisins(i, j, 1); + dessine(w, i, j, VIVANT); + } else { + dessine(w, i, j, MORT); + } } } -int nbVoisins(int i, int j) +void update0(DrawingWindow& w) { - int n = 0; - for (int k = i - 1 ; k <= i + 1 ; ++k) - for (int l = j - 1 ; l <= j + 1 ; ++l) - if (k != i || l != j) { - int vi = (k + LARGEUR) % LARGEUR; - int vj = (l + HAUTEUR) % HAUTEUR; - if (cells[vi][vj][0]) - ++n; + for (int i = 0 ; i < LARGEUR ; ++i) + for (int j = 0 ; j < HAUTEUR ; ++j) { + int n = cells[i][j].neigh; + if (cells[i][j].now) { + if (n < 2 || n > 3) { + cells[i][j].next = false; + dessine(w, i, j, MOURANT); + } + } else { + if (n == 3) { + cells[i][j].next = true; + dessine(w, i, j, NAISSANT); + } } - return n; + } } -void update() +void update1(DrawingWindow& w) { for (int i = 0 ; i < LARGEUR ; ++i) for (int j = 0 ; j < HAUTEUR ; ++j) { - int v = nbVoisins(i, j); - if (cells[i][j][0]) - cells[i][j][1] = (v == 2 || v == 3); - else - cells[i][j][1] = (v == 3); + if (cells[i][j].now) { + if (!cells[i][j].next) { + cells[i][j].now = false; + majVoisins(i, j, -1); + dessine(w, i, j, MORT); + } + } else { + if (cells[i][j].next) { + cells[i][j].now = true; + majVoisins(i, j, 1); + dessine(w, i, j, VIVANT); + } + } } } @@ -67,20 +97,22 @@ void jeudelavie(DrawingWindow& w) { w.setBgColor(BORDURE); w.clearGraph(); - init(); + init(w); + w.sync(); for (int gen = 0 ; ; ++gen) { if (gen % 10 == 0) std::cerr << "generation " << gen << std::endl; - w.sync(); - draw(w); - update(); + update0(w); + // w.sync(); + update1(w); + // w.sync(); } } int main(int argc, char *argv[]) { QApplication app(argc, argv); - DrawingWindow win(jeudelavie, TCELL * LARGEUR + 1, TCELL * HAUTEUR + 1); + DrawingWindow win(jeudelavie, LARGEUR, HAUTEUR); win.show(); return app.exec(); } -- 2.20.1