fill, setFillMode, getFillMode

Définition Utilisation Exemple Côté technique
 

Pour faire des remplissages par diffusion, on met le premier point dans une pile. Le remplissage proprement dit consiste à:
- prendre un point dans la pile, et si il doit être rempli:
      - le remplir
      - mettre les 4 points adjacents dans une pile.

Cela consomme beaucoup trop d'espace de stockage interne. On peu diminuer la taille du stockage interne par différents moyens. Ceux que j'ai utilisés sont:
- avant de remplir un point, je vais le plus à gauche possible
- je remplis toute la ligne possible vers la droite, ainsi je ne mets pas dans la pile les points à droite et à gauche.
- si plusieurs points consécutifs se suivent au dessus ou en dessous, je n'empile que le premier

Par défaut la pile est de 32 points mémorisés, cela doit suffire grandement à la plupart des cas. En gros pour remplir un rectangle ou un cercle, il suffit de 2 points. Pour changer le fond d'écran, si il y a N objets, il faut environ N points à mémoriser.

Si le dessin est trop complexe, il n'y a pas la possibilité de stocker tous les points dans la pile. Certains sont "oubliés" et le remplissage sera partiel, il y aura des parties intactes. Pour palier à ce défaut, on peut augmenter la taille de la pile. Dans le fichier PecheuxGraph.h de la bibliothèque, dans les premières lignes, changez la taille de la pile. Par défaut il y a:
#define FILL_MAX (1<<5) // 2 puissance 5 soit 32 départs maximum
Pour augmenter la taille de la pile:
#define FILL_MAX (1<<6) // 2 puissance 6 soit 64 départs maximum
Le programme suivant permet de tester les limites de fill().

 

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-204-fillCrash\Exemple-204-fillCrash.ino (dans votre fichier téléchargé):

// Ce programme montre que si on a trop d'obstacles, fill() ne peut plus tout
// mémoriser et certaines zones ne sont pas remplies. On trace des lignes verticales
// qui ne vont pas jusqu'au bord, puis on remplit l'écran. Pour avoir quelque chose
// de différent à chaque fois, on initialise le générateur aléatoire avec un temps de
// réaction humain 

#include <PecheuxGraph.h>

void setup() 
{
  setGraphMode(PAYSAGE); // Obligatoire pour utiliser l'afficheur

  // Initialisation d'un vrai générateur pseudoaléatoire
  text("Appuyez sur l'écran"); // Information pour ne pas mettre un écran noir
  while(!isTouch()); // On attend un temps variable
  randomSeed(micros()); // Initialisation avec une valeur qui ne sera jamais la même
  clrscr(); // Suppression du message
  
  for (int Nb=0; Nb<50; Nb++) // 50 lignes, à changer pour faire le test
     // Obstacles n'allant pas jusquau bord:
     vLine(random(LARGEUR-2)+1, random(HAUTEUR-2)+1, random(HAUTEUR-2)+1, GREEN);
  fill(0, 0, GREEN); // Remplit l'écran, complètement si la pile est suffisante
}

void loop()
{
}

 

Avec 40 lignes verticales cela passe souvent. Voici le dessin avant le remplissage:

Et après:

Avec 50 lignes verticales, voici le dessin avant le remplissage:

Et après! Cela ne passe plus, on a perdu des point de départ parce qu'il y en avait trop, et certaines zones ont été oubliées. Il y a des "trous":

Si l'on veut mette plus d'objets, il faut donc augmenter la taille de la pile.