Matrice et recursion

Fermé
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018 - 16 avril 2018 à 01:21
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 16 avril 2018 à 16:15
bonsoir,
enfaite j'etait entrain de travailler sur javascript sur un projet d'etude et du coup j'ai rencontré un probleme que j'arrive pas a surmonter depuis deux jours. mon probleme j'ai travailler sur le recursion et du coup voila aujourd'hui je suis amener a faire un projet la dessus.
donc c'est je veux ce que j'ai une matrice composé de carré , du coup chaque case contient un nombre entier et du coup lorsque ce nombre depasse le trois, je veux ajouter de un a ses voisins et lui je doit retrancher de trois. plus precisement chaque il a quatre voisins(comme c'est un carré il ne peut y avoir plus).
donc j'ai proposé ce code mais ca produits rien.
voici la methode qui permet d'initialiser aleatoirement les case:
function random_grid_grain(alea){
    for (var i = 0; i<taille1;i=i+1) {
        grid[i] = [];
        for (var j = 0; j < taille2 ; j = j+1) {
        grid[i][j]=alea;
        }
    }
    return grid;
}

et voila le code que j'ai mit en place et qui me pose probleme
$("#step").on("click",function(){
    
    matrice = random_grid_grain(alea);
    
    for(var i = 0 ; i < matrice.length ; i ++){
        matrice[i]=[];
        for (var j = 0; j < matrice.length; j++) {
            if(matrice[i][j]>3){
                matrice[i][j] -=3;
                matrice[i-1][j]++;
                 matrice[i][j+1]++;
                 matrice[i+1][j]++;
                 matrice[i][j-1]++;
            update_grid(matrice,colors);
            }
        }
    }
   
});

et enfin la methode update_grid
function draw_grid(data, colors,taille1,taille2) {
    var color_obj = {};
    for (var i = 0; i < colors.length; i+=2) {
        color_obj[colors[i]] = colors[i+1]; 
    }
    var width = taille1;
    var height = taille2;
    var grid_length = data.length;
    var width_cell = width/grid_length;
    var height_cell = width/grid_length;

    var canvas = document.getElementById("grid")
    if (canvas == null) {
        canvas = document.createElement('canvas');
        canvas.id = "grid";
        canvas.width = 600;
        canvas.height = 600;

        document.getElementsByTagName('body')[0].appendChild(canvas);

    }
     var context = canvas.getContext("2d");
   
    function draw_cells(){
        for (var i = 0; i < grid_length; i++) {
            for (var j = 0; j < grid_length; j++) {
                if (_data && _data[i][j] === data[i][j]) {
                    continue;
                } 
                context.fillStyle = color_obj[data[i][j]];
                context.fillRect(i*width_cell, j*height_cell, width_cell, height_cell);
            }
        }
    }
    draw_cells();
    if (!_data) {
        _data = [];
    }
    for (var i = 0; i < grid_length; i++) {
        _data[i] = data[i].slice();
    }
}


function update_grid(data,colors) {
    draw_grid(data, colors,taille1,taille2);
}        

s'il en y a quelqu'un m'a compris je voudrait une aide ou une suggestion de votre part merci d'avance.

1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
16 avril 2018 à 10:36
Bonjour,

Pour commencer, quelques remarques d'ordre plus général :

- je ne vois aucune récurrence dans ton code, uniquement de l'itératif (ce n'est pas un mal !)

- quel rafraîchissement visuel de ta grille tu souhaites avoir ? Tu veux visualiser les « explosions » se propager, de gauche à droite puis de bas en haut ? Ou avoir uniquement le résultat final ?

- si tu veux voir les explosions se propager, souhaites-tu qu'elles soient résolues de façon itérative (on parcourt tout le tableau plusieurs fois jusqu'à ce que plus rien ne change) ou récursive (parcours du tableau en arbre, à chaque fois qu'on fait +1 sur une case on vérifie son état et on le résout avant de passer à la suite)
À première vue je dirais que le résultat final sera le même quel que soit l'ordre de résolution.
Par contre le code pour le générer va bien changer.

- attention, pour une matrice suffisamment « chaude » initialement et grande (avec plus de cases centrales que de coins), tes règles amènent vers un réchauffement infini, donc tu n'auras pas d'état final. En effet, les coins refroidissent l'ensemble (une explosion se solde par une température finale de -3 +1 +1 = -1), les bords sont neutres, et les cases centrales font +1. Ta matrice va donc se refroidir par les coins et s'auto-entretenir voire s'emballer par le centre.


Maintenant, les problèmes que je vois dans ton code :
- telle que construite, ta matrice va contenir la même valeur partout. Du coup si Alea vaut 1, rien ne se passe nulle part...
- ta fonction qui fait les +1 / -3 ne parcours qu'une seule fois tout le tableau, il restera donc des cases >3 à la fin
- l'updateGrid peut être optimisé parce que toute la grille est reparcourue à chaque fois. Tu dois pouvoir lui donner des paramètres pour ne mettre à jour que la case que tu sais avoir changé.

Xavier
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018
16 avril 2018 à 11:17
oui je veux voire les explosions se propager dans le quatre coin. et puis je voulais employer la recursivité. et du coup vous avez parlez du temperature de truc du genre dont j'ai pas compris. mais le plus important que vous avez compris mon probleme. et ce que je veux visualiser les explosition et les propagation. merci
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
16 avril 2018 à 11:39
(Oui j'ai utilisé le terme de "température" pour parler de la valeur de chaque case, désolé c'était pas très clair... Chaud quand ça monte, froid quand ça baisse...)
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
16 avril 2018 à 11:45
Du coup dans ton code, quand "rien ne se passe", tu es sûr que "alea" est supérieur ou égal à 3 ?
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018
16 avril 2018 à 12:45
je fait de tel sorte que je choisi la valeur alea superieur a 3 pour visualiser le propagation
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018
16 avril 2018 à 12:46
sinon au debut tout les case ont la meme valeur de alea.
0