1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| function M = grassfire (M, R, seedrow, seedcol, neighb, done, docell)
% Fonction générique qui applique de proche en proche un traitement sur les
% mailles d'une matrice. Le traitement se propage comme un "feu de prairie" :
% tout voisin non "brulé" prend feu. Le traitement s'arrête à la frontière
% de la prairie.
%
% Notes :
% ======
% Récursion : La profondeur de récursion est au pire prof = numel(M).
% dans le cas général : prof = max(size(M)).
% Caractère générique : le caractère générique de la fonction est assuré de
% plusieurs manières :
% 1) par le passage en argument des fonction qui font effectivement les calculs.
% 2) par le passage d'un tableau compagnon W qui peut être utilisé
% indépendamment du tableau M pour déterminer qui doit encore être traité
% et comment.
%
% Arguments :
% ==========
% M = le tableau à modifier
% R = tableau annexe de même taille que M
% seedrow, seedcol = le point de départ de la récursion
% [r, c] = neighb (r0, c0, size) = fonction qui retourne les
% index de ligne et de colonne des voisins de la maille (r0, c0) dans une
% matrice de taille size.
% d = done (M, R, r, c) = fonction qui retourne vrai si la maille (r,c) est
% déjà traitée, faux sinon.
% m = docell (M, R, r, c) = fonction qui retourne la nouvelle valeur à
% affecter à la maille M(r,c).
grassfire_recurse (seedrow, seedcol, neighb, done, docell)
function grassfire_recurse (seedrow, seedcol, neighb, done, docell)
% docell the incoming cell
M(seedrow, seedcol) = docell (M, R, seedrow, seedcol) ;
% docell all the neighbors of the incoming seed
[r, c] = neighb(seedrow, seedcol, size(M)) ;
for k=1:numel(r)
if ~done (M, R, r(k), c(k))
grassfire_recurse(r(k), c(k), neighb, done, docell) ;
end
end
end
end |
Partager