Class floodfill (implementation de l'algo de remplissage par germe)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 603 fois - Téléchargée 27 fois

Contenu du snippet

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!");
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
86
Date d'inscription
samedi 18 mars 2006
Statut
Membre
Dernière intervention
21 août 2008

Tu es vraiment une bète de flash ! J'admire !
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
pour voir la class en action va voir ma source "implementation du jawbreaker en as2"
Messages postés
113
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
28 mars 2010

Hi

Je vois exactement à quoi peu me servir cette class ...

Du genre (et vous allez rire par rapport a votre niveau),
remplir un patatoide ...

En fait j aimerais pouvoir m en servir faire une explorateur de territoire ... mais honnetement je vois pas trop comment ca marche ...
Un zip serait il possible , ou si je comprend tout seul je peu faire parti du Club

En tout ca bravo les gars ...
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
lol
oui, sur des icons, le format est assez petit pour ça...
Messages postés
293
Date d'inscription
vendredi 26 septembre 2003
Statut
Membre
Dernière intervention
25 septembre 2008

Reconnaissance... si si...
Je pense que d'ores et déjà on pourait le faire avec des icones 32X32 en 16 ou même 256 couleurs, les arrays seraient à comparer avec une banque d'icone et des codage couleurs par zone stockés dans des dll par exemple... Et pourquoi pas interprêter des formes similaire mais bon...
Afficher les 12 commentaires

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.