在矩形边界内拟合字符串的算法

时间:2016-01-07 20:39:56

标签: c# algorithm math

我正在尝试编写一个用于在矩形内部拟合字符串的算法,捕获的是每个字母是另一个矩形,是具有可修改尺寸的实际字母的图像。 我当前的算法只是减少每个字母矩形的宽度和高度,直到总宽度(所有字母宽度的总和)小于主矩形的宽度。这可以很好地将字符串拟合到一行,但换行是我的问题。

有关此主题的任何建议或参考都会有所帮助。

我在.net C#环境中工作。

感谢。

编辑: 1)这是所需结果的样本(它可以适合超过2行) Sample of desired result

2)最终结果将使用自定义构建的渲染算法在图像上呈现。

3)当前拟合算法:

do
{
    ratio -= 0.05f;
    FinalHeight = (int)(height * ratio);
    totalWidth = GetTotalWidth(FinalHeight, text);
 } 
 while (totalWidth > DestRectangle.Width);

int GetTotalWidth(int Height, char[] Text)
{
    int totalWidth = 0;
    int spaces = 0;
    float letterHeight = 0;

    foreach (char c in Text)
    {
        if (Char.IsWhiteSpace(c))
        {
            spaces++;
            continue;
         }

         BoundingRect bounds = GetBoundingRectangle(c);

         float letterWidth = bounds.Width;
         letterHeight = bounds.Height;
         int width = (int)((letterWidth * Height) / letterHeight);
         totalWidth += width;
    }

    totalWidth += (int)(spaces * (totalWidth / Text.Length));

    return totalWidth;
}

1 个答案:

答案 0 :(得分:0)

这似乎不是一个小问题。

我会尝试这种攻击方式:给定白色空格的位置,你可以枚举所有可能的短语片段(例如"这个","这是",&# 34;这是" ..."随机","随机文本",...)。对于N个单词,有N.(N + 1)/ 2种可能性。

对于每个片段,计算其实际宽度。然后确定自动换行,以便在其他行上不会超出此宽度。这会告诉您所需的行数。 (对于某些片段,这是不可能的。)

例如,片段"随机"应该产生

This is
a random
text to
fit

和"随机文字"

This is a
random text
to fit

现在你有一个边界框,你可以告诉它在给定的矩形中适合它的缩放因子(垂直或水平填充)。

最后,保持最大的缩放。