Autore Topic: Curvare la linea di testo  (Letto 510 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Curvare la linea di testo
« il: 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ì:
.
Qualcuno lo ha già fatto ?
Il suo nome verrà ovviamente adeguatamente citato nella pagina della Wiki.


Vietato proporre porcherie con Shell !  :nono:
« Ultima modifica: 24 Dicembre 2019, 16:00:31 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #1 il: 24 Dicembre 2019, 16:20:37 »
Citazione
Vietato proporre porcherie con Shell ! 
:D :D :D
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #2 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #3 il: 24 Dicembre 2019, 16:49:41 »
Citazione
... Editto imperiale
... eeee chi sarebbe l'imperatore ???  :P
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #4 il: 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

« Ultima modifica: 24 Dicembre 2019, 18:43:29 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #5 il: 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


« Ultima modifica: 24 Dicembre 2019, 19:51:28 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #6 il: 24 Dicembre 2019, 20:16:27 »
Però!
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.316
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #7 il: 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
« Ultima modifica: 25 Dicembre 2019, 02:56:48 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Curvare la linea di testo
« Risposta #8 il: 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

« Ultima modifica: 25 Dicembre 2019, 15:50:53 da kicco »
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)