Page 1 sur 1

[TUTO] Ecrire du texte incurvé

Publié : mar. 21/janv./2025 15:23
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


Re: [TUTO] Ecrire du texte incurvé

Publié : jeu. 23/janv./2025 18:52
par Mindphazer
Pas mal, très sympa
Et fonctionne très bien sur MacOS

Merci !

Re: [TUTO] Ecrire du texte incurvé

Publié : mer. 29/janv./2025 20:48
par Kwai chang caine
Marche aussi sur W10
Merci du partage 8)

Re: [TUTO] Ecrire du texte incurvé

Publié : mer. 29/janv./2025 21:12
par Shadow
Salut yves86 :)

C'est pas mal merci à toi, tu pourais en faire une fonction, c'est sympa.

Re: [TUTO] Ecrire du texte incurvé

Publié : jeu. 30/janv./2025 18:20
par Philippe_GEORGES
Un grand merci !!

Ce code fonctionne parfaitement !

Phil

Re: [TUTO] Ecrire du texte incurvé

Publié : ven. 31/janv./2025 15:54
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