Cette class fonctionne dans des matrices de type {array[y][x] = valeur}
elle sert a connaitre les case de meme valeur situé dans la meme zone que la case indiqué lors de l'initialisation. Comme ce n'est pas tres clair, voici un exemple:
voici une matrice, un array a 2 dimention de type array[number][letter].
0ABCDEFGHIJKLM
0xxxxxxxxxx0xx
1xxxxx00xxx0xx
2xxxx0000xxxxx
3xx000xx00xxxx
4xxxxxxx00xxxx
5xxxxxxxxxxxxx
Si on init la class sur la case [2][g], nous obtiendrons dans un array toutes les case remplies de "0" SAUF [0][K] et [1][K] car elles ne sont pas dans la meme zone (ou meme tache).
On appel ça un algo de remplissage par germe car on utilise une methode recurcive pour trouver les cases. Il existe d'autres algo pour ce meme resultat comme l'algo par balayage lineaire, etc...
L'utilité c'est à vous de voir!
je m'en suis servit dans mon implementation du jawBreaker par exemple.
Quand elle a fini son execution, la class fait un dispatchEvent de type "finished" (utilisation de la class GDispatcher de Grand Skinner,
http://www.gskinner.com/blog/archives/000027.html)
Source / Exemple :
// floodfill.as
//
// @version: 1.0
// @author: blackwizzard
// @comment: Implementation de l'algorithme de remplissage par germe.
// utile la class GDispatcher de Grant Skinner
import GDispatcher;
class floodfill {
var dispatchEvent:Function;
var addEventListener:Function;
var removeEventListener:Function;
var eventListenerExists:Function;
var removeAllEventListeners:Function;
private static var _eventDispatcherInit;
var a:Array;
var m:Array;
var v;
//
function floodfill(matrice:Array, x:Number, y:Number) {
_eventDispatcherInit = GDispatcher.initialize(this);
a = new Array();
m = new Array();
m = matrice;
v = m[y][x];
checkPoint(x, y);
dispatchMessage("finished");
}
//
function checkPoint(x, y) {
if (m[y][x] == v && !isOnArray(x, y)) {
a.push(new Object({x:x, y:y}));
if (!isOnArray(x, y-1)) {
checkPoint(x, y-1);
}
if (!isOnArray(x-1, y)) {
checkPoint(x-1, y);
}
if (!isOnArray(x, y+1)) {
checkPoint(x, y+1);
}
if (!isOnArray(x+1, y)) {
checkPoint(x+1, y);
}
}
}
//
function isOnArray(x, y) {
for (var i = 0; i<=a.length-1; i++) {
if (a[i].x == x && a[i].y == y) {
return true;
}
}
return false;
}
//
private function dispatchMessage(type:String):Void {
this.dispatchEvent({target:this, type:type});
}
//
function matrix() {
return a;
}
}
Conclusion :
utilisation:
var ff = new floodfill(matrice, xpos, ypos);
var newMatrix:Array = new Array();
newMatrix = ff.matrix();
for (var i= 0; i<=newMatrix.length-1;i++) {
trace("point [x:"+newMatrix[i].x+", y:"+newMatrix[i].y+"] found!");
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.