/**
 * \file ElementStructurant.h
 * Implante une structure de stockage d'elements structurants pour les filtres de morphologie mathematique
 * et definit quelques elements structurants usuels.
 * Exemple:<br>
 * [ .. X .. X .. ]<br>
 * [ X .. X .. _ ]<br>
 * [ .. _ .. 0 .. ]<br>
 * X : pixel devant etre present<br>
 * _ : pixel indifferent<br>
 * 0 : pixel devant etre absent  
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */

#ifndef ____ELEMENTSTRUCTURANT____
#define ____ELEMENTSTRUCTURANT____

/**
 * \struct elementStructurant
 * Structure de stockage d'un element structurant pour filtre de convolution a matrice hexagonale.
 * Exemple:<br>
 * [ .. X .. X .. ]<br>
 * [ X .. X .. _ ]<br>
 * [ .. _ .. 0 .. ]<br>
 * X : pixel devant etre present<br>
 * _ : pixel indifferent<br>
 * 0 : pixel devant etre absent  
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
struct elementStructurant {
  /// La valeur centrale
  int c;
  /// La valeur droite
  int d;
  /// La valeur inferieure droite
  int id;
  /// La valeur inferieure gauche
  int ig;
  /// La valeur gauche
  int g;
  /// La valeur superieure gauche
  int sg;
  /// La valeur superieure droite
  int sd; };

/**
 * \typedef elementStructurant
 * Structure de stockage d'un element structurant.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
typedef struct elementStructurant elementStructurant;

/**
 * Element structurant complet.
 * [ .. X .. X .. ]<br>
 * [ X .. X .. X ]<br>
 * [ .. X .. X .. ] 
 */
extern struct elementStructurant ELEMENT_STRUCTURANT_COMPLET;

/**
 * Element structurant de squelettisation type 1.
 * [ .. X .. X .. ]<br>
 * [ _... X .. _ ]<br>
 * [ .. 0 .. 0 .. ] 
 */
extern struct elementStructurant ELEMENT_STRUCTURANT_SQUELETTISATION_1;

/**
 * Element structurant de squelettisation type 2.
 * [ .. X .. X .. ]<br>
 * [ X .. X .. _ ]<br>
 * [ .. _ .. 0 .. ] 
 */
extern struct elementStructurant ELEMENT_STRUCTURANT_SQUELETTISATION_2;

/**
 * Initialise un element structurant avec l'element structurant complet.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element complet.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementComplet(struct elementStructurant *e,int bits);

/**
 * Initialise un element structurant avec l'element structurant de squelettisation numero 1.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element structurant de squelettisation numero 1.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementSquelettisation1(struct elementStructurant *e,int bits);

/**
 * Initialise un element structurant avec l'element structurant de squelettisation numero 2.
 *
 * @param e le pointeur sur l'element structurant a initaliser a l'element structurant de squelettisation numero 2.
 * @param bits le nombre de bits de l'image destinee a l'element structurant.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void initialiseElementSquelettisation2(struct elementStructurant *e,int bits);
/**
 * Tourne de 60° les valeurs d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a modifier.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void rotation(struct elementStructurant *e);

/**
 * Transpose les valeurs d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a modifier.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
void transpose(struct elementStructurant *e);

/**
 * Construit une chaine de caracteres de description d'un element structurant.
 *
 * @param e le pointeur sur l'element structurant a traiter.
 * @return la chaine de caracteres construite
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 12/01/06
 */
char *toString(struct elementStructurant *e);
  
#endif
