Curvare la linea di testo in un oggetto Image

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca

Una soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo Image per quante sono le lettere alfabetiche o le sillabe.
Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti Image.
Infine tali oggetti Image verrebbero adeguatamente ruotati in modo perpendicolare al raggio della circonferenza (o dell'arco) e disegnati/fusi in un Oggetto Image principale più grande, per formare il testo completo e apparentemente curvato.

Mostriamo un esempio pratico:

Private Const GRADI_INIZIO As Float = 270.0
Private Const CURVATURA As Float = 8.0


Public Sub Form_Open()

 Dim pb As PictureBox
 Dim testo As String
 Dim fo As Font
 Dim an As Float
 Dim ii As Image[]
 Dim b As Byte
 Dim i, im As Image
 Dim x, y, x_a, y_o, r As Short
 
 Me.Show
 
 With Me
   .Center
   .W = 600
   .H = 600
   .Arrangement = Arrange.Fill
 End With
 
 With pb = New PictureBox(Me)
   .X = 0
   .Y = 0
 End With
 
' Imposta il testo da disegnare:
 testo = "Questo e' un testo qualsiasi"
 
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
 an = GRADI_INIZIO
 
 ii = New Image[]
 
 For b = 1 To Len(testo)
' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:
   With fo = New Font
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
     i = New Image(.TextWidth(Mid(testo, b, 1)), .TextHeight(Mid(testo, b, 1)), Color.Transparent, gb.Standard)
   End With
   With Paint
     .Begin(i)
     .DrawText(Mid(testo, b, 1), 0, 0, i.W, i.H, Align.Normal)
     .End
   End With
  
   i = i.Rotate(Rad(-an))
   ii.Push(i)
   an += CURVATURA
 Next 
 
 x_a = pb.W / 2    ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale
 y_o = pb.H / 2    ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale
 r = 200           ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Crea l'Oggetto "Image" ove saranno disegnate le singole immagini dei caratteri per ricreare il testo ruotato:
 im = New Image(pb.W, pb.H, Color.Yellow, gb.Standard)
 
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le singole Image nella Image "im" superficie principale:
 an = GRADI_INIZIO - 90.0
 
 For b = 0 To ii.Max
' Imposta la curvatura delle singole Image dei caratteri:
   x = x_a + r * Cos(Rad(an)) 
   y = y_o + r * Sin(Rad(an))
   With Paint
     .Begin(im)
     .DrawImage(ii[b], x, y, ii[b].W, ii[b].H, 1.0, Null)
     .End
   End With
' Imposta la distanza delle singole immagini dei caratteri fra esse:
   an += CURVATURA
 Next
 
 pb.Image = im

End