【问题标题】:How to keep text inside a circle using Cairo?如何使用开罗将文本保持在一个圆圈内?
【发布时间】:2011-02-17 02:19:42
【问题描述】:

我使用 Cairo(特别是 pycairo)绘制图形,我需要知道如何在不重叠的情况下在圆圈内绘制文本,方法是将其保持在圆圈的边界内。我有这个简单的代码 sn-p 在圆圈内绘制一个字母“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),我需要动态设置字体的大小。无论圆圈大小或标签大小,它都必须适合圆圈内。此外,每个标签都有一行文本,没有空格,没有换行符。

有什么建议吗?

【问题讨论】:

标签: python graphics cairo pycairo


【解决方案1】:

我遇到了类似的问题,我需要调整字体的大小以将对象的名称保持在矩形边界内,而不是圆形。我使用了一个while循环,并不断检查字符串的文本范围大小,减小字体大小直到适合为止。

这是我所做的:(这是在 Kylix 下使用 C++,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;
}

当然,这不会显示错误检查。如果矩形(或您的圆圈)太小,您将不得不跳出循环。

【讨论】:

    【解决方案2】:

    由于圆的大小无关紧要,您应该按照与您的代码相反的顺序绘制它们。

    1. 在屏幕上打印文本
    2. 计算文本边界(使用文本范围)
    3. 在文本周围画一个比文本稍大一点的圆圈。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多