4

私はカイロ(具体的にはpycairo)を使用してグラフを描画していますが、円の境界内にテキストを保持することで、テキストを重ねずに円の内側に描画する方法を知る必要があります。円の中に文字「a」を描くこの単純なコードスニペットがあります。

'''
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

問題は、ラベルの文字数が可変であり(20文字まで)、フォントのサイズを動的に設定する必要があることです。円のサイズやラベルのサイズに関係なく、円の内側に収まる必要があります。また、すべてのラベルには1行のテキストがあり、スペースや改行はありません。

なにか提案を?

4

2 に答える 2

3

同様の問題が発生しました。フォントのサイズを調整して、オブジェクトの名前を円ではなく長方形の境界内に維持する必要があります。whileループを使用して、文字列のテキスト範囲のサイズをチェックし続け、収まるまでフォントサイズを小さくしました。

ここで私がしたこと:(これは、Delphiの派生物であるKylixの下でC ++を使用しています)。

    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;
}

もちろん、これはエラーチェックを示していません。長方形(または円)が小さすぎる場合は、ループから抜け出す必要があります。

于 2010-05-14T18:12:51.633 に答える
3

円のサイズは重要ではないため、コードとは逆の順序で描画する必要があります。

  1. 画面にテキストを印刷する
  2. テキストの境界を計算します(テキストの範囲を使用)
  3. テキストから少し大きい円をテキストの周りに描きます。
于 2010-08-12T13:19:24.500 に答える