如何计算边界矩形的宽度,以使文本包裹以适合特定比例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算边界矩形的宽度,以使文本包裹以适合特定比例?相关的知识,希望对你有一定的参考价值。
如果我有以下文字:
“你好,这是一段文字,将显示在屏幕的矩形区域”
我知道文字的总宽度。
我试图根据给定的比率找到一个包围文本的边界宽度。
算法是什么?
例如,我想总是尝试按宽度和高度包装文本,其中边界矩形的比例为16:9。无论文本长度如何,都需要这样做。
这是我如何在伪代码中做到这一点
function calcWidth(string text, int rows, float ratio)
let H be int with value /* how many pixels high is a row? */
let total_width be int with value 0
for each character c in string text
let total_width be total_width + pixel_width(c)
end for
let W = total_width / length(text)
/* RATIO = (H * row) / (W * col) */
/* means col = (H * row) / (W * RATIO) */
let cols be int with value (H * rows) / (W * ratio)
return cols
end function
我也可以在那里检查,如果5行是不可接受的,但是6行更糟,我知道5比6更好所以我会在这种情况下返回5。
让我们回顾一下我们所知道的
对于等宽字体:
H * rows
---------- = RATIO
W * cols
现在,我们知道每行的cols不会相同,因为我们可能没有monospaced。但是,我们可以将cols近似为字母总数除以行数。
H * rows
-------------- = RATIO
W * len / rows
H * rows^2
-------------- = RATIO
W * len
现在您知道除行之外的所有这些变量,因此求解行
rows = roundUp ( SQRT ( (RATIO * W * len) / h ) )
现在我们从上面知道cols是近似的
cols = (H * rows) / (W * ratio)
有了这两个你应该对你的盒子有一个不错的猜测。
您可能需要渲染它才能看到,并且可能会向上或向下增加或减少一行,具体取决于错误的大小和余量。
由于字长是不可预测的,我认为没有比生成和测试更好的方法。您可以从找到一个单词边界开始,比如说,在文本的第9/16行,并使用到该点的宽度作为候选宽度。然后迭代包装所有文本,测量结果,并向左或向右移动第一个边界,直到您尽可能接近。这为您提供了第一行以及上限和下限(一个词多一个或少一个词)的最佳中断,如果您愿意,可以使用二进制搜索进一步搜索最佳解决方案。
以上是关于如何计算边界矩形的宽度,以使文本包裹以适合特定比例?的主要内容,如果未能解决你的问题,请参考以下文章
在GridView AutoGenerateColumns中调整列的宽度以使文本适合页面