ecrire un texte en diagonale sur tft ?

bonjour

c'est juste une question de boucles...

la fonction drawchart ( caracter, pos h, pos v, taille , color)
je sais ecrire le texte de haut en bas, effacer, texte bouge d'une colonne, etc..
avec une boucle for et en incrementant la pos h
j'ai essayer d'utiliser 2 boucles le 1er caractere 1ere colonne 1ere ligne, 2eme caractere 2eme colonne 2eme ligne, etc..
comment faire ?
merci

void loop()
{
TFT_BL_ON;
for (int pos=0; pos < 220;pos=pos+40)
{

for (int pos2=0; pos2<316;pos2=pos2+35)

{
Tft.drawChar('A',pos,pos2,4,color1);

Tft.drawChar('L',pos,pos2,4,BLUE);

Tft.drawChar('E',pos,pos2,4,GREEN);

Tft.drawChar('X',pos,pos2,4,color2);

Tft.drawChar('A',pos,pos2,4,CYAN);
Tft.drawChar('N',pos,pos2,4,WHITE);
Tft.drawChar('D',pos,pos2,4,BLUE);
Tft.drawChar('R',pos,pos2,4,BRIGHT_RED);
Tft.drawChar('A',pos,pos2,4,CYAN);
delay(500);
Tft.fillScreen; //efface ecran
} }

delay (1000);
TFT_BL_OFF;

void loop()  
{
  TFT_BL_ON;
  for (int pos=0; pos < 220;pos=pos+40)
{
  
for (int pos2=0; pos2<316;pos2=pos2+35)

   {
Tft.drawChar('A',pos,pos2,4,color1);  
              
    Tft.drawChar('L',pos,pos2,4,BLUE);             
    
    Tft.drawChar('E',pos,pos2,4,GREEN);            
    
    Tft.drawChar('X',pos,pos2,4,color2);           
   
    Tft.drawChar('A',pos,pos2,4,CYAN);          
     Tft.drawChar('N',pos,pos2,4,WHITE);
      Tft.drawChar('D',pos,pos2,4,BLUE);
      Tft.drawChar('R',pos,pos2,4,BRIGHT_RED);
      Tft.drawChar('A',pos,pos2,4,CYAN);
      delay(500);
      Tft.fillScreen; //efface ecran
            } }
           
            delay (1000);
            TFT_BL_OFF;

Bonjour,

Si j'ai bien compris tu veux afficher ton texte comme cela:

  0 ________________________________320
   |A                               |
   |    L                           |
   |        E                       |
   |            X                   |
   |                A               |
   |                    N           |
   |                        D       |
   |                            R   |
240|_______________________________A|

Pour l'instant tes for loop affichent tous les caractères aux coordonnées {0, 0}, puis tous les caractères aux coords { 0, 35 }, puis tous les caractères aux coords { 0, 70 } etc ???

Une solution consiste à calculer les coordonnées de chaque caractère, en calculant d'abord l'espacement entre chaque caractère à partir de coordonnée de début et de fin.

Supposons que tu veuille afficher le premier caractère aux coords { 20, 20 } et le dernier aux coords { 300, 220 }. On calcule les espacements:

L'espacement X de chaque caractère sera: ( fin X - départ X ) / ( nb de caractères - 1 ) = (300-20) / (9-1) = 280 / 8 = 35
L'espacement Y de chaque caractère sera: ( fin Y - départ Y ) / ( nb de caractères - 1 ) = (220-20) / (9-1) = 200 / 8 = 25

Puis on calcul les coordonnées de chaque caractère en ajoutant l'espacement requis:

Coordonnées X du caractère 0 ( 'A' ) = ( 0 * espacement X ) + départ X = ( 0 * 35 ) + 20 = 20
Coordonnées Y du caractère 0 ( 'A' ) = ( 0 * espacement Y ) + départ Y = ( 0 * 25 ) + 20 = 20
Coordonnées X du caractère 1 ( 'L' ) = ( 1 * espacement X ) + départ X = ( 1 * 35 ) + 20 = 55
Coordonnées Y du caractère 1 ( 'L' ) = ( 1 * espacement Y ) + départ Y = ( 1 * 25 ) + 20 = 45
Etc etc...

Voici ce que ça donne en code:

char text[] = "ALEXANDRA"; // le texte à afficher

int startPos[] = { 20, 20 }; // coordonnées X Y du premier caractère
int endPos[] = { 300, 220 }; // coordonnées X Y du dernier caractère

size_t len = strlen( text ); // le nombre de caractères dans le texte

int distances[2]; // pour stocker les espacements entre chaque caractère 
distances[0] = ( endPos[0] - startPos[0] ) / (len-1); // calcul de l'espacement X
distances[1] = ( endPos[1] - startPos[1] ) / (len-1); // calcul de l'espacement Y

// calcul des coordonnées et affichage de chaque caractère
for ( int i = 0; i < len; i++ )
{
 int x = ( i * distances[0] ) + startPos[0]; // calcul de la coord X
 int y = ( i * distances[1] ) + startPos[1]; // calcul de la coord Y
 Tft.drawChar( text[i], x, y, 4, BLUE ); // affichage
}

Je te laisse chercher un peu pour ajouter la couleur à chaque caractère :wink:

Ah et une petite précision, j'ai fais les calculs avec des int, dans ce cas précis, ça fonctionne, mais si tu compte changer la longueur du texte et/ou les coordonnées de départ et de fin, il y a de grandes chances que les valeurs pour les espacements ne soient pas des nombres entiers, il faudra donc utiliser des variables de type float, et arrondir les coordonnées des caractères au plus proche pixel ( avec la fonction round() ) sinon le texte ne sera pas bien centré.

exactement çà, merci beaucoup

en 12 lignes de code tu écris exactement ce que je cherche depuis 3 jours (nuits en fait)

quand on ne connait rien en langage C ou autre ( a part les bases qbasic il y a 20 ans) et qu'on est nul en maths comme moi, vaut mieux juste copier les sketchs du net ....

le croquis final que j'ai adapté donne affichage comme ceci (la mise en forme lors de l'envoi décale le truc mais j'ai bien en réel le bon espacement etc...)
0____________240
|A |
| L
| E |
| X
| A
| N
| D
| R |
|________A |

si je veux orienter le texte en mode paysage comme ton dessin la lib tftshieldv2 originale ne le permet pas
http://forum.arduino.cc/index.php?topic=150900.0
je dois utiliser le cpp et h modifié expliqué sur ce topic (en anglais, matiere dans laquelle je suis aussi nul) ou regarder du coté de la lib ili9340 de adafruit
pour l'instant le code que tu as écrit me suffit amplement, grand merci

/*  draw text's APP
    drawChar(INT8U ascii,INT16U poX, INT16U poY,INT16U size, INT16U fgcolor);
    drawString(char *string,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
connexions d4 rst , d5 cs, d6 d/c, d12 mosi , d11 miso, d13 sck, d7 LED

*/


#include <stdint.h>
#include <TFTv2.h>
#include <SPI.h>
#define color1	0xfd00  //orange clair
#define color2 0xeeff //mauve
void setup()
{
    TFT_BL_OFF;      //
    Tft.TFTinit();  // init TFT library
    Tft.fillScreen();
}

void loop()  
{  TFT_BL_ON;
char text[] = "ALEXANDRA"; // le texte à afficher

int startPos[] = { 5, 5 }; // coordonnées X Y du premier caractère
int endPos[] = { 220, 300 }; // coordonnées X Y du dernier caractère

size_t len = strlen( text ); // le nombre de caractères dans le texte

int distances[2]; // pour stocker les espacements entre chaque caractère 
distances[0] = ( endPos[0] - startPos[0] ) / (len-1); // calcul de l'espacement X
distances[1] = ( endPos[1] - startPos[1] ) / (len-1); // calcul de l'espacement Y

// calcul des coordonnées et affichage de chaque caractère
for ( int i = 0; i < len; i++ )
{
 int x = ( i * distances[0] ) + startPos[0]; // calcul de la coord X
 int y = ( i * distances[1] ) + startPos[1]; // calcul de la coord Y
 Tft.drawChar( text[i], x, y, 3, WHITE); // affichage
 delay (250);
 //Tft.fillScreen();
 Tft.drawChar( text[i], x, y, 3, GREEN);
  
}
delay(1500);
 Tft.fillScreen(); }