Dimensions de l'écran

extern int LARGEUR; // Largeur de l'écran en pixels (p.ex 320)
extern int HAUTEUR; // Hauteur de l'écran en pixels (p.ex 240)
#define MAX_X (LARGEUR-1) // Valeur maximale des abscisses (p.ex 319)
#define DEMI_LARGEUR (LARGEUR>>1) // Abscisse du centre de l'écran (p.ex 160)
#define MAX_Y (HAUTEUR-1) // Valeur maximale des ordonnées (p.ex 239)
#define DEMI_HAUTEUR (HAUTEUR>>1) // Ordonnée du centre de l'écran (p.ex 120)
#define PETIT_COTE 240 // Petit côté de l'écran
#define GRAND_COTE 320 // Grand côté de l'écran
extern int MIN_X_DRAW; // Abscisse minimale pouvant être dessiné
extern int MAX_X_DRAW; // Abscisse maximale pouvant être dessiné
extern int MIN_Y_DRAW; // Ordonnée minimale pouvant être dessiné
extern int MAX_Y_DRAW; // Ordonnée maximale pouvant être dessiné
extern int MIN_X_TEXT; // Abscisse minimale pouvant être écrit
extern int MAX_X_TEXT; // Abscisse maximale pouvant être écrit
extern int MIN_Y_TEXT; // Ordonnée minimale pouvant être écrit
extern int MAX_Y_TEXT; // Ordonnée maximale pouvant être écrit

 

Exemples d'utilisation

for (x=0; x<LARGEUR; x++) ... // Balaie toutes les abscisses
for (x=0; x<=MAX_X; x++) ... // Balaie toutes les abscisses, c'est équivalent
for (x=0; x<=LARGEUR-1; x++) ... // C'est encore équivalent
line(0, 0, MAX_X, MAX_Y, WHITE); // Diagonale de l'écran
circle(DEMI_LARGEUR, DEMI_HAUTEUR, PETIT_COTE/2-1, WHITE); // Plus grand cercle.

 

Voir aussi

- setLimites(); Limite la zone de dessin
- setGraphMode(); Initialisation de l'écran
- setTextOrient(); Direction d'écriture des textes
- clrscr(); Efface l'écran

 

Notes

Pour le plus grand cercle, si le rayon (qui est entier) fait PETIT_COTE/2-1 pixels, le diamètre fait le double, PETIT_COTE-2 pixels , mais le cercle s'étale sur PETIT_COTE-1 pixels. Un cercle plus grand (diamètre PETIT_COTE+1) ne tiendrait pas. Si vous avez du mal à le comprendre, regardez le dessin à gauche. En rouge un cercle, en vert le centre c'est la partie médiane d'un cercle. C'est bien un cercle de rayon 1 (distance entre un point rouge et le point vert est de 1 pixel (1 case), il a un diamètre de 2 pixels, mais il a besoin de 3 pixels pour être dessiné (2 rayons+1)

En réalité ce sont presque toutes des variables. Ce ne peut pas être des constantes étant donné qu'elles peuvent changer au cours du programme. Mais pour des raisons pratiques elles sont définies comme telles. On ne doit pas les modifier. Seules PETIT_COTE et GRAND_COTE sont de vraies constantes.

Ces "constantes" permettent d'éviter d'utiliser les nombres comme 320 ou 319. D'autre part le passage des modes paysages à portraits change la définition de ces mots. En les utilisant, on peut écrire des programmes qui fonctionnent sans changements dans les 4 modes.

Notez que MAX_X=LARGEUR-1 et DEMI_LARGEUR=LARGEUR/2, mais cela ne consomme pas plus de ressources d'utiliser dans un programme DEMI_LARGEUR ou LARGEUR/2.

Les mots LARGEUR, HAUTEUR, MAX_X, MAX_Y, DEMI_LARGEUR, DEMI_HAUTEUR concernent l'écran en entier. On peut changer la zone dans laquelle s'effectue les dessins par la fonction setLimites(); La zone dans laquelle on peut dessiner est alors définie par MIN_X_DRAW, MAX_X_DRAW, MIN_Y_DRAW et MAX_Y_DRAW. Comme on peut changer l'orientation des écritures, et que les coordonnées suivent l'orientation, les textes peuvent être écrits dans la zone définie par MIN_X_TEXT, MAX_X_TEXT, MIN_Y_TEXT et MAX_Y_TEXT. Si on écrit vers l'est les deux zones sont les mêmes.

 

Exemple

PecheuxGraph_ILI9341_8bits.zip\PecheuxGraph_ILI9341_8bits\examples\Documentation\Exemple-101-MAX_X\Exemple-101-MAX_X.ino (dans votre fichier téléchargé):

// Ce programme fonctionne dans les 4 orientations, et c'est pour cela qu'est
// utilisé LARGEUR, MAX_X....
// Il dessine la Joconde, avec son cadre.

#include <PecheuxGraph_ILI9341_8bits.h>

void setup() 
{
}

char mode;

void loop()
{
  setGraphMode(PAYSAGE); // Initialisation de l'écran

  // Dessine un cadre bariolé :
  // On remplit d'abord tout l'écran avec des lignes bariolées passant par le centre pour
  // faire les bordures en haut et en bas
  for (int x=0; x<LARGEUR; x // Car les abscisses vont de 0 à LARGEUR-1 ou de 0 à MAX_X
    line(x, 0, MAX_X-x, MAX_Y, RANDOM_COLOR); // Cette ligne passe par le centre
  // Puis avec des lignes bariolées passant par le centre pour faire les bordures latérales
  for (int y=HAUTEUR-2; y>=0 ; --y) // Car les ordonnées vont de 0 à HAUTEUR-1 ou de 0 à
    // MAX_Y mais on a déjà tracé la diagonale
    line(0, y, MAX_X, MAX_Y-y, RANDOM_COLOR);
  // Et on efface le centre pour laisser le cadre
  fillRect(10, 10, MAX_X-10, MAX_Y-10, BLACK);

  // Et on dessine toto dans le cadre
  circle(DEMI_LARGEUR, DEMI_HAUTEUR, 80, WHITE); // la tête. 
      // Ici DEMI_LARGEUR ou MAX_X/2 est à peu près pareil, l'écran ayant un nombre
      //  de pixels pair, il n'y a pas de centre exact
  arc(DEMI_LARGEUR, DEMI_HAUTEUR+20, 40, DEPART_SUD_EST+ARRIVEE_SUD_OUEST, WHITE); // La bouche
  circle(DEMI_LARGEUR-20, DEMI_HAUTEUR-30, 5, WHITE); // Les yeux
  circle(DEMI_LARGEUR+20, DEMI_HAUTEUR-30, 5, WHITE); 
  line(DEMI_LARGEUR, DEMI_HAUTEUR-10, DEMI_LARGEUR-10, DEMI_HAUTEUR+20, WHITE); // Le nez
  lineTo(DEMI_LARGEUR+10, DEMI_HAUTEUR+20);

  // Affichage du mode
  setTextCursor(11,11);
  switch (getGraphMode())
  {
    case PAYSAGE: text(F("Paysage")); break;
    case PORTRAIT: text(F("Portrait")); break;
    case PAYSAGE_INVERSE: text(F("egasyaP")); break;
    case PORTRAIT_INVERSE: text(F("tiartroP"));    
  }

  delay(3000); // Pour voir le produit fini
}

Résultat:

 

graphMode   <<     >>   clrscr()