IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[GD] Pour les matheux : centrer un texte dans une diagonale


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut [GD] Pour les matheux : centrer un texte dans une diagonale
    Bonjour à tous,

    Ben oui : j'ai quitté l'école il y a longtemps...

    Soit une image carrée de 500 x 500 pixels, barrée par une bande en diagonale de gauche à droite dont les coordonnées (x, y) sur l'image sont :

    x=25 , y=0
    x=55, y=0
    x=500, y=470
    x=500, y=440

    Avec GD et imagettftext(), je souhaite écrire un texte dans cette diagonale.
    Et le centrer.

    J'ai crée une petite fonction qui centre Y :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    function centrage_texte_y($heightIm, $taille_T, $font_TTF, $texte)
    {
    $size = imagettfbbox($taille_T,-45,$font_TTF,$texte); 
    $dy = abs($size[5]-$size[1]);
    $espY = $heightIm - $dy;
    $y = ($espY / 2);
    return $y;
    } 
     
    //que j'appelle comme ceci :
    $texte = "Mon texte exemple en diagonale";
    $y_centre = centrage_texte_y($height, 16, "fonts/Verdana.ttf", $texte);
    //écriture du texte dans l'image
    imagettftext($img, 16, -45, $X, $y_centre, $rouge, "fonts/Verdana.ttf", $texte);
    Et ça fonctionne, la valeur de Y est ok. La phrase, grâce à l'angle de valeur -45 s'affiche bien en diagonale....mais $X manque. Comment le calculer ?

    Par rapport à y que je connais ?
    Avec le tableau $size que retourne imagettfbbox() ?
    Avec un subtil mélange des deux ?

    Ben moi je sèche totalement !

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Je ne suis pas très doué en Maths non plus mais je pense qu'il suffit d'appliquer le théorème de pythagore :

    D (Diagonale) = RACINE(Largeur²+Hauteur²)
    X = (Largeur - LargeurTexte) / 2
    Y = (Hauteur - HauteurTexte) / 2
    Angle = COS(Largeur / D)

    dans un triangle rectangle, le carré de l'hypoténuse est égal à la somme des carrés des deux côtés de l'angle droit; La somme des angles d'un triangle est égale à deux droits (180°), ce qui se démontre facilement pour un triangle rectangle

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    OU la la, le bon vieux Pythagore !
    Je l'avais oublié celui-là...

    Mon image est un carré de 500 x 500.
    La bande diagonale (de gauche à droite) dans laquelle je veux écrire :

    - est de 30 px de largeur
    - commence à Y=0 - X=25 / X=55
    - se termine à Y=440 / Y=470 - X=500

    Elle de part donc pas de 0/0 pour finir à 500/500.

    Si je connais Y du début de mon texte en fonction de sa longueur, comment calculer X sachant qu'il dépend de Y ?

    Tu dis :
    D (Diagonale) = RACINE(Largeur²+Hauteur²)
    La diagonale de mon carré est égale à 707.1 : d'accord.
    Je pense que imagettfbbox() peut me donner la hauteur du texte...
    Mais qu'est ce que j'en fais ?

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Une fois que tu as la hauteur et la largeur du texte tu as toutes les clés en main

    D (Diagonale) = RACINE(Largeur²+Hauteur²)
    X = (Largeur - LargeurTexte) / 2
    Y = (Hauteur - HauteurTexte) / 2
    Angle = COS(Largeur / D)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imagettftext($img, 16, -$ANGLE, $X, $Y, $rouge, "fonts/Verdana.ttf", $texte);

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Grâce à ta formule j'ai fait la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    function xy($height, $taille_T, $font_TTF, $texte) {
    $diag = sqrt(($height * $height) + ($height * $height));
    $size = imagettfbbox($taille_T,-45,$font_TTF,$texte);
    $LargeurTexte = abs($size[5]-$size[1]);
    $HauteurTexte = abs($size[6]-$size[0]);
    $X = ($height - $LargeurTexte) / 2;
    $Y = ($height - $HauteurTexte) / 2;
    $Angle = cos($height / $diag);
    $tab = array("X"=>$X,"Y"=>$Y,"Angle"=>$Angle);
    return $tab;
    }
     
    $texte = "Ici un joli texte dans une diagonale";
    $tab = xy(500, 16, "fonts/Verdana.ttf", $texte);
    $x = $tab['X'];
    $y = $tab['Y'];
    $Angle = $tab['Angle'];
     
    imagettftext($dest, 16, -$Angle, $x, $y, $rouge, "fonts/Verdana.ttf", $texte);
    Le début du texte est pile-poile au centre du carré 500 x 500 mais le texte est droit...donc il ne suit pas du tout la diagonale.
    Et je m'étonne que le début Y du texte soit au centre vertical (donc je pense que dans ce calcul il vaut 250)...vu la longueur de la phrase ça devrait être moins...

    Voici $tab selon cette config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Array
    (
        [X] => 118
        [Y] => 241
        [Angle] => 0.76024459707563
    )
     
    Il est bizarre, l'angle, non ?

  6. #6
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,
    J'ai peut-être fait une erreur dans mes calculs mais en tout cas dans ton script ton calcul de l'hypothénus est mauvais, remplaces ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $diag = sqrt(($height * $height) + ($height * $height));
    Par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $diag = sqrt(($height * $height) + ($width* $width));

Discussions similaires

  1. Centrer un texte dans une page
    Par Samanta dans le forum Mise en forme
    Réponses: 5
    Dernier message: 20/09/2010, 22h30
  2. [ImageMagick] Centrer du texte dans une image
    Par Ministar dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/09/2007, 18h44
  3. Centrer le texte dans une Combobox
    Par mouloudéen dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/04/2007, 09h06
  4. [MFC] Centrer du texte dans une RichEdit
    Par firejocker dans le forum MFC
    Réponses: 2
    Dernier message: 13/02/2006, 10h05
  5. Centrer le texte dans une TStringGrid
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/06/2004, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo