Ardu? No!PxGraphRéférence ≫ Initialisations ≫ Dimensions de l'écran

Dimensions de l'écran

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

Toutes ces valeurs sont en lecture seule (on les interpète comme des constantes). Certaines sonT modifiées par setGraphMode.

 

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

// 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 <PxGraph_ST7781_Shield.h> // Voir http://arduino.dansetrad.fr/PxGraph

void setup()
{
}

char mode;
word w;

void loop()
{
  setGraphMode(mode++); // Comme mode va s'incrémenter, cela va faire défiler les directions

  // Dessine un cadre bariolé :

  // Pour le haut, on demande des droites allant de la bordure haute vers le centre, mais en ne dessinant que les 10 pixels les plus hauts
  setLimites(0, 0, MAX_X, 10); // On ne dessine que ce qui est dans les 10 pixels les plus hauts
  for (int x = 0; x < LARGEUR; x++) // Car les abscisses vont de 0 à LARGEUR-1 ou de 0 à MAX_X
    line(x, 0, DEMI_LARGEUR, DEMI_HAUTEUR, RANDOM_COLOR); // Lignes parcourant le bord haut et passant par le centre

  // Pour le côté droit, on demande des droites allant de la bordure droite vers le centre, mais en ne dessinant que les 10 pixels les plus à droite
  setLimites(MAX_X-10, 0, MAX_X, MAX_Y); // On ne dessine que ce qui est dans les 10 pixels les plus à droite
  for (int y = 0; y < HAUTEUR; y++) // Car les ordonnées vont de 0 à HAUTEUR-1 ou de 0 à MAX_Y
     line(MAX_X, y, DEMI_LARGEUR, DEMI_HAUTEUR, RANDOM_COLOR); // Lignes parcourant le bord droit et passant par le centre

  // Pour le bas, on demande des droites allant de la bordure basse vers le centre, mais en ne dessinant que les 10 pixels les plus bas
  setLimites(0, MAX_Y-10, MAX_X, MAX_Y); // On ne dessine que ce qui est dans les 10 pixels les plus bas
  for (int x = MAX_X; x >= 0; x--) // Car les abscisses vont de LARGEUR-1 à 0 ou de MAX_X à 0
    line(x, MAX_Y, DEMI_LARGEUR, DEMI_HAUTEUR, RANDOM_COLOR); // Lignes parcourant le bord haut et passant par le centre

  // Pour le côté gauche, on demande des droites allant de la bordure gauche vers le centre, mais en ne dessinant que les 10 pixels les plus à gauche
  setLimites(0, 0, 10, MAX_Y); // On ne dessine que ce qui est dans les 10 pixels les plus à gauche
  for (int y = MAX_Y; y >= 0; y--) // Car les ordonnées vont de HAUTEUR-1 à 0 ou de MAX_Y à 0
     line(0, y, DEMI_LARGEUR, DEMI_HAUTEUR, RANDOM_COLOR); // Lignes parcourant le bord droit et passant par le centre

  setLimites(); // On remet pour l'écran complet
  
  
  

  // 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); circle(DEMI_LARGEUR + 20, DEMI_HAUTEUR - 30, 5, WHITE); // Les yeux
  line(DEMI_LARGEUR, DEMI_HAUTEUR - 10, DEMI_LARGEUR - 10, DEMI_HAUTEUR + 20, WHITE); lineTo(DEMI_LARGEUR + 10, DEMI_HAUTEUR + 20); // Le nez

  // 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("egaasyaP")); break;
    case PORTRAIT_INVERSE: text(F("tiartroP"));
  }

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

Résultat: