Domanda

Ho un disegno un grafico utilizzando Cairo (pycairo in particolare) e ho bisogno di sapere come posso disegnare il testo all'interno di un cerchio senza sovrapposizioni di esso, con l'all'interno dei limiti del cerchio. Ho questo semplice frammento di codice che disegna una lettera "a" all'interno del cerchio:

'''
Created on May 8, 2010

@author: mrios
'''
import cairo, math

WIDTH, HEIGHT = 1000, 1000

#surface = cairo.PDFSurface ("/Users/mrios/Desktop/exampleplaces.pdf", WIDTH, HEIGHT)
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context (surface)

ctx.scale (WIDTH/1.0, HEIGHT/1.0) # Normalizing the canvas


ctx.rectangle(0, 0, 1, 1) # Rectangle(x0, y0, x1, y1)
ctx.set_source_rgb(255,255,255)
ctx.fill()

ctx.arc(0.5, 0.5, .4, 0, 2*math.pi)
ctx.set_source_rgb(0,0,0)
ctx.set_line_width(0.03)
ctx.stroke() 

ctx.arc(0.5, 0.5, .4, 0, 2*math.pi)
ctx.set_source_rgb(0,0,0)
ctx.set_line_width(0.01)
ctx.set_source_rgb(255,0,255) 
ctx.fill()
ctx.set_source_rgb(0,0,0)

ctx.select_font_face("Georgia",
            cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
ctx.set_font_size(1.0)
x_bearing, y_bearing, width, height = ctx.text_extents("a")[:4]
print ctx.text_extents("a")[:4]
ctx.move_to(0.5 - width / 2 - x_bearing, 0.5 - height / 2 - y_bearing)
ctx.show_text("a")

surface.write_to_png ("/Users/mrios/Desktop/node.png") # Output to PNG

Il problema è che le mie etichette hanno quantità variabile di caratteri (con un limite di 20) e ho bisogno di impostare la dimensione del carattere dinamico. Essa deve inserirsi all'interno del cerchio, non importa la dimensione del cerchio né le dimensioni dell'etichetta. Inoltre, ogni etichetta ha una riga di testo, senza spazi, senza interruzioni di riga.

Ogni suggerimento?

È stato utile?

Soluzione

Ho avuto un problema simile, dove ho bisogno di regolare la dimensione del carattere da mantenere il nome del mio oggetto entro i confini di rettangoli, non cerchi. Ho usato un ciclo while, e tenuto controllare la dimensione del testo estensione della stringa, diminuendo la dimensione del carattere fino adattarla.

Ecco quello che ho fatto:. (Questo è in C ++ in Kylix, un derivato Delphi)

    double fontSize = 20.0;
    bool bFontFits = false;

    while (bFontFits == false)
    {
        m_pCanvas->Font->Size = (int)fontSize;
        TSize te = m_pCanvas->TextExtent(m_name.c_str());
        if (te.cx < (width*0.90))  // Allow a little room on each side
        {
            // Calculate the position
            m_labelOrigin.x = rectX + (width/2.0) - (te.cx/2);
            m_labelOrigin.y = rectY + (height/2.0) - te.cy/2);
            m_fontSize = fontSize;
            bFontFits = true;
            break;
        }
        fontSize -= 1.0;
}

Naturalmente, questo non mostra il controllo degli errori. Se il rettangolo (o il vostro cerchio) è troppo piccolo, si dovrà uscire dal giro.

Altri suggerimenti

Dal momento che la dimensione del cerchio non importa si dovrebbe disegnarli in ordine inverso rispetto il vostro codice.

  1. Stampa il testo sullo schermo
  2. Calcolare i confini di testo (con estensioni di testo)
  3. Disegna un cerchio intorno al testo che è solo un po 'più grande dal testo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top