[TUTO] Ecrire du texte incurvé

Informations pour bien débuter en PureBasic
yves86
Messages : 39
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

[TUTO] Ecrire du texte incurvé

Message par yves86 »

Bonjour,
Voici ma modeste contribution :
Comment écrire un texte incurvé pour légender un camembert par exemple ou des segments de cercle.

Code : Tout sélectionner


If OpenWindow(0, 0, 0, 400, 400, "Texte incurvé", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 400, 400)
  LoadFont(0, "Arial", 14, #PB_Font_HighQuality|#PB_Font_Bold)
  Texte0$ ="Secteur 0 haut"
  Texte1$ ="Secteur 1 haut"
  Texte2$ ="Secteur 2 haut"
  Texte3$ ="Secteur 3 bas"
  Texte4$ ="Secteur 4 bas"
  Texte5$ ="Secteur 5 bas"
  If StartVectorDrawing(CanvasVectorOutput(0))
    X_Centre = 200
    Y_Centre = 200
    Long_branche = 170
    
    Dgr_Rad.f = #PI/180
    Taille_p.l = 12
    VectorSourceColor(RGBA(211, 211, 211, 255))
    For j = 0 To 5
      MovePathCursor(X_Centre,Y_Centre)
      Angle_valeur = (360 / 6 * j) - 90
      X_valeur = X_Centre + (Cos(Dgr_Rad * (Angle_valeur - 30)) * (Long_branche + 20)) 
      Y_valeur = Y_Centre + (Sin(Dgr_Rad * (Angle_valeur - 30)) * (Long_branche + 20))
      AddPathLine(X_valeur , Y_valeur)
      StrokePath(1)
    Next
    
    VectorFont(FontID(0), Taille_p)
    VectorSourceColor(RGBA(0, 0, 0, 255))
    larc = 60/360 *2 * 3.14 * Long_branche
    Debug larc
    Long.f = VectorTextWidth(texte0$)
    Ltarc0 = Long / larc * 60
    RotateCoordinates(X_Centre,Y_Centre,-60 - ((Ltarc0) / 2))
    For i =1 To Len(Texte0$)
      lettre$ = Mid(Texte0$,i,1)
      MovePathCursor(X_Centre,Y_Centre - Long_branche - Taille_p)
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,Ltarc0/Long*VectorTextWidth(lettre$))
    Next
    
    ResetCoordinates()
    Long.f = VectorTextWidth(texte1$)
    Ltarc1 = Long / larc * 60
    RotateCoordinates(X_Centre,Y_Centre, - (Ltarc1 / 2))
    For i =1 To Len(Texte1$)
      lettre$ = Mid(Texte1$,i,1)
      MovePathCursor(X_Centre,Y_Centre - Long_branche - Taille_p)
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,Ltarc1/Long*VectorTextWidth(lettre$))
    Next
    
    ResetCoordinates()
    Long.f = VectorTextWidth(texte2$)
    Debug "l2=" + Str(Long)
    Ltarc2 = Long / larc * 60
    RotateCoordinates(X_Centre,Y_Centre, 60 - ((Ltarc2) / 2))
    For i =1 To Len(Texte2$)
      lettre$ = Mid(Texte2$,i,1)
      MovePathCursor(X_Centre,Y_Centre - Long_branche  - Taille_p)
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,Ltarc2/Long*VectorTextWidth(lettre$))
    Next
    
    ResetCoordinates()
    Long.f = VectorTextWidth(texte3$)
    Ltarc3 = Long / larc * 60
    RotateCoordinates(X_Centre ,Y_Centre, -60 + ((Ltarc3) / 2))
    For i =1 To Len(Texte3$)
      lettre$ = Mid(Texte3$,i,1)
      MovePathCursor(X_Centre ,Y_Centre + Long_branche )
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,-Ltarc3/Long*VectorTextWidth(lettre$))
    Next
    
    ResetCoordinates()
    Long.f = VectorTextWidth(texte4$)
    Ltarc4 = Long / larc * 60
    RotateCoordinates(X_Centre ,Y_Centre,((Ltarc4) / 2))
    For i =1 To Len(Texte4$)
      lettre$ = Mid(Texte4$,i,1)
      MovePathCursor(X_Centre ,Y_Centre + Long_branche )
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,-Ltarc4/Long*VectorTextWidth(lettre$))
    Next
    
    ResetCoordinates()
    Long.f = VectorTextWidth(texte5$)
    Ltarc5 = Long / larc * 60
    RotateCoordinates(X_Centre ,Y_Centre,60 + ((Ltarc5) / 2))
    For i =1 To Len(Texte5$)
      lettre$ = Mid(Texte5$,i,1)
      MovePathCursor(X_Centre ,Y_Centre + Long_branche )
      DrawVectorText(lettre$)
      RotateCoordinates(X_Centre,Y_Centre,-Ltarc5/Long*VectorTextWidth(lettre$))
    Next
    
    StopVectorDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Dernière modification par yves86 le mar. 21/janv./2025 15:29, modifié 1 fois.
Avatar de l’utilisateur
Mindphazer
Messages : 693
Inscription : mer. 24/août/2005 10:42

Re: [TUTO] Ecrire du texte incurvé

Message par Mindphazer »

Pas mal, très sympa
Et fonctionne très bien sur MacOS

Merci !
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [TUTO] Ecrire du texte incurvé

Message par Kwai chang caine »

Marche aussi sur W10
Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: [TUTO] Ecrire du texte incurvé

Message par Shadow »

Salut yves86 :)

C'est pas mal merci à toi, tu pourais en faire une fonction, c'est sympa.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Philippe_GEORGES
Messages : 138
Inscription : mer. 28/janv./2009 13:28

Re: [TUTO] Ecrire du texte incurvé

Message par Philippe_GEORGES »

Un grand merci !!

Ce code fonctionne parfaitement !

Phil
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
yves86
Messages : 39
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

Re: [TUTO] Ecrire du texte incurvé

Message par yves86 »

Nouvelle version avec 2 fonctions pour écrire le texte au dessus du centre et en dessous, plus possibilité de justifier le texte à gauche, à droite ou au centre.

Code : Tout sélectionner

Procedure Texte_incurvee_up_center(Texte.s,angle_dispo.l,angle_debut.l,X_Centre.l, Y_Centre.l,L_branche.l,H_texte.l, Align.l=0)
  ; au dessus de X centre
  ; Angle_debut par rapport au centre haut
  Pos_start.f
  ResetCoordinates()
  larc.f = angle_dispo /360 *2 * 3.14 * L_branche
  Long.f = VectorTextWidth(texte) 
  Ltarc.f = Long / larc * angle_dispo
  Select Align
    Case #PB_Text_Center
      Pos_start = (angle_debut + (angle_dispo - Ltarc) / 2)
    Case #PB_Text_Right
      Pos_start = angle_dispo + angle_debut - Ltarc
    Default
      Pos_start = angle_debut
  EndSelect
  RotateCoordinates(X_Centre,Y_Centre, Pos_start)
  For i =1 To Len(Texte)
    lettre$ = Mid(Texte,i,1)
    MovePathCursor(X_Centre,Y_Centre - L_branche - H_texte)
    DrawVectorText(lettre$)
    RotateCoordinates(X_Centre,Y_Centre,Ltarc/Long*VectorTextWidth(lettre$))
  Next
  
EndProcedure

Procedure Texte_incurvee_down_center(Texte.s,angle_dispo.l,angle_debut.l,X_Centre.l, Y_Centre.l,L_branche.l, Align.l=0)
  ; au dessous de X centre
  ; Angle_debut par rapport au centre haut
  Pos_start.f
  ResetCoordinates()
  larc.f = angle_dispo /360 *2 * 3.14 * L_branche
  Long.f = VectorTextWidth(texte) 
  Ltarc.f = Long / larc * angle_dispo
  Select Align
    Case #PB_Text_Center
      Pos_start = angle_debut - 180 + angle_dispo - ((angle_dispo - Ltarc) / 2)
    Case #PB_Text_Right
      Pos_start = angle_debut - 180 + Ltarc
    Default
      Pos_start = angle_debut - 180 + angle_dispo
  EndSelect
  RotateCoordinates(X_Centre,Y_Centre,Pos_start)
  For i =1 To Len(Texte)
    lettre$ = Mid(Texte,i,1)
    MovePathCursor(X_Centre,Y_Centre + L_branche)
    DrawVectorText(lettre$)
    RotateCoordinates(X_Centre,Y_Centre,-Ltarc/Long*VectorTextWidth(lettre$))
  Next
  
EndProcedure

If OpenWindow(0, 0, 0, 440, 440, "Texte incurvé", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 440, 440)
  LoadFont(0, "Arial", 14, #PB_Font_HighQuality|#PB_Font_Bold)
  Texte0$ ="Secteur 0 haut gauche"
  Texte1$ ="Secteur 1 haut center"
  Texte2$ ="Secteur 2 haut droite"
  Texte3$ ="Secteur 3 bas gauche"
  Texte4$ ="Secteur 4 bas centré"
  Texte5$ ="Secteur 5 bas droite"
  If StartVectorDrawing(CanvasVectorOutput(0))
    X_Centre = 220
    Y_Centre = 220
    Long_branche = 170
    Dgr_Rad.f = #PI/180
    Taille.l = 12
    VectorSourceColor(RGBA(211, 211, 211, 255))
    For j = 0 To 5
      MovePathCursor(X_Centre,Y_Centre)
      Angle_valeur = (360 / 6 * j) - 90
      X_valeur = X_Centre + (Cos(Dgr_Rad * (Angle_valeur - 30)) * (Long_branche + 20)) 
      Y_valeur = Y_Centre + (Sin(Dgr_Rad * (Angle_valeur - 30)) * (Long_branche + 20))
      AddPathLine(X_valeur , Y_valeur)
      StrokePath(1)
      MovePathCursor(X_valeur,Y_valeur)
      DrawVectorText(Str(Angle_valeur + 60))
    Next
    VectorFont(FontID(0), Taille)
    Taille_p = VectorTextHeight(Texte0$,#PB_VectorText_Default)
    VectorSourceColor(RGBA(0, 0, 0, 255))
    Texte_incurvee_up_center(Texte0$,60,-90,X_Centre,Y_Centre, Long_branche,Taille_p, 0)
    Texte_incurvee_up_center(Texte1$,60,-30,X_Centre,Y_Centre, Long_branche,Taille_p,#PB_Text_Center)
    Texte_incurvee_up_center(Texte2$,60,30,X_Centre,Y_Centre, Long_branche,Taille_p, #PB_Text_Right)
;     ; sous le X centre
    Texte_incurvee_down_center(Texte3$,60,90,X_Centre,Y_Centre, Long_branche,0)
    Texte_incurvee_down_center(Texte4$,60,150,X_Centre,Y_Centre, Long_branche,#PB_Text_Center)
    Texte_incurvee_down_center(Texte5$,60,210,X_Centre,Y_Centre, Long_branche,#PB_Text_Right)
    StopVectorDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
Répondre