Gambas-it

Gambas3 => Programmazione => Topic aperto da: vuott - 24 Dicembre 2019, 15:59:10

Titolo: Curvare la linea di testo
Inserito da: vuott - 24 Dicembre 2019, 15:59:10
E' assolutamente necessario scrivere una pagina della nostra Wiki per spiegare con un semplice codice come ottenere un testo curvato... insomma così:
(https://robadagrafici.com/wp-content/uploads/2014/08/testo-su-tracciato-circolare-con-illustrator.jpg).
Qualcuno lo ha già fatto ?
Il suo nome verrà ovviamente adeguatamente citato nella pagina della Wiki.


Vietato proporre porcherie con Shell !  :nono:
Titolo: Re:Curvare la linea di testo
Inserito da: kicco - 24 Dicembre 2019, 16:20:37
Citazione
Vietato proporre porcherie con Shell ! 
:D :D :D
Titolo: Re:Curvare la linea di testo
Inserito da: vuott - 24 Dicembre 2019, 16:34:22
Per ora ho trovato una possibilità usando le funzioni esterne della libreria di pango-cairo.

L'uso delle funzioni esterne con Extern è consentito in questo forum in virtù dell'Editto imperiale: "Edictum de externis funcionibus utendis".   :devil:

Però, ovviamente, sono un'opzione estrema. :-X
Titolo: Re:Curvare la linea di testo
Inserito da: kicco - 24 Dicembre 2019, 16:49:41
Citazione
... Editto imperiale
... eeee chi sarebbe l'imperatore ???  :P
Titolo: Re:Curvare la linea di testo
Inserito da: vuott - 24 Dicembre 2019, 18:38:58
Una prima ipotesi sarebbe quella di creare tante piccoli oggetti Image per quante sono le lettere o le sillabe.
Tali lettere o sillabe verrebbero poi disegnate in un rispettivo Oggetto Image.
Infine tali Oggetti Image verrebbero ruotati e disegnati/fusi in un Oggetto Image più grande o su una DrawingArea per formare il testo completo e apparentemente curvato. :-X

Titolo: Re:Curvare la linea di testo
Inserito da: vuott - 24 Dicembre 2019, 19:34:25
Per ora avrei scritto questo esempio base:

Codice: [Seleziona]
Public Sub Form_Open()

  Dim im, i As Image
  Dim b As Byte = 97
  Dim x, y, x_a, y_o, r, an As Short
 
  With Me
    .Center
    .W = 400
    .H = 400
  End With

  x_a = 200   ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'immagine principale
  y_o = 200   ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'immagine principale
  r = 100     ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche:
  im = New Image(Me.W, Me.H, Color.White, gb.Standard)
 
  For an = 180 To 360 Step 7    ' Rappresenta l'angolo dell'arco (ci si sposta di 7° in senso orario lungo l'arco)
   
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
    i = New Image(20, 25, Color.Transparent, gb.Standard)
    With Paint
      .Begin(i)
      .Font.Size = 12
      .Text(Chr(b), 1, 1, i.W, i.H, Align.Center)
      .Stroke
      .End
    End With
   
    i = i.Rotate(Rad(an + 90))
 
    x = x_a + r * Cos(Rad(an))
    y = y_o + r * Sin(Rad(an))
    With Paint
      .Begin(im)
      .DrawImage(i, x, y, i.W, i.H)
      .End
    End With
    Inc b
  Next
   
  With PictureBox1
    .X = 0
    .Y = 0
    .W = Me.W
    .H = Me.H
    .Image = im
  End With

End


Titolo: Re:Curvare la linea di testo
Inserito da: kicco - 24 Dicembre 2019, 20:16:27
Però!
Titolo: Re:Curvare la linea di testo
Inserito da: vuott - 25 Dicembre 2019, 02:39:06
...anche questo codice:

Codice: [Seleziona]
Public Sub Form_Open()

  Dim im, i As Image
  Dim b As Byte
  Dim x, y, x_a, y_o, r As Short
  Dim an As Float
  Dim cl As Integer
  Dim bb As New Byte[]
  Dim fo As Font
  Dim s As String
 
  With Me
    .Center
    .W = 600
    .H = 600
  End With

  x_a = 260   ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale
  y_o = 260   ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale
  r = 150     ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Impone il testo da disegnare.
' Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore:
  bb = bb.FromString("È lì giù che saprò se vivrà.")
 
' Imposta il colore di partenza:
  cl = Color.Blue
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
  an += 204.0
 
' Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche del testo:
  im = New Image(Me.W, Me.H, Color.White, gb.Standard)

  For b = 0 To bb.Max
   
' Verifica se il carattere è accentato:
    If bb[b] > 127 Then
' Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:
      s = Chr(bb[b]) & Chr(bb[b + 1])
      Inc b
    Else
      s = Chr(bb[b])
    Endif
   
' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:
    With fo = New Font
      .Name = "FreeSans"
      .Size = 18
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
      i = New Image(.TextWidth(s) + 4, .TextHeight(s) + 4, Color.Transparent, gb.Standard)
    End With
   
    With Paint
      .Begin(i)
      .Font.Size = 18
      .Font.Name = "FreeSans"
      .Brush = .Color(cl)
      .Text(s, 1, 1, i.W, i.H, Align.Center)
      .Fill
      .End
    End With

    i = i.Rotate(Rad(an + 90))
 
    x = x_a + r * Cos(Rad(an))
    y = y_o + r * Sin(Rad(an))
    With Paint
      .Begin(im)
      .DrawImage(i, x, y, i.W, i.H)
      .End
    End With
' Imposta la distanza dei caratteri fra essi:
    an += 5.0
   
    cl += 668457
  Next
   
  With PictureBox1
    .X = 0
    .Y = 0
    .W = Me.W
    .H = Me.H
    .Image = im
  End With

End
Titolo: Re:Curvare la linea di testo
Inserito da: kicco - 25 Dicembre 2019, 15:43:55
Curiosità:
ho sostituito
 i = i.Rotate(Rad(an + 90))
con
 i = i.Rotate(Rad(an / 110 - 2))
le lettere diventano (quasi) verticali