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: