有一段文字(可能很长)。还有一个高度和宽度的容器。如何使文本(全部)适合容器?只能调整字符间距(字距)和字间间距。我真的不在乎文本是否会过于封闭 - 我只是在里面所有内容。将文本放入容器中
为了解释这个问题,我需要一个高效的换行算法,其中成本是线的“包装性”。
我知道在TeX中使用Knuth-Plass算法,但实现起来有点困难,我甚至不确定它在这种情况下是否可用。我也可以使用遗传算法,但这可能是一种矫枉过正。
有一段文字(可能很长)。还有一个高度和宽度的容器。如何使文本(全部)适合容器?只能调整字符间距(字距)和字间间距。我真的不在乎文本是否会过于封闭 - 我只是在里面所有内容。将文本放入容器中
为了解释这个问题,我需要一个高效的换行算法,其中成本是线的“包装性”。
我知道在TeX中使用Knuth-Plass算法,但实现起来有点困难,我甚至不确定它在这种情况下是否可用。我也可以使用遗传算法,但这可能是一种矫枉过正。
这是一个想法。
首先,估计你想要文本的行数,让这个数字为n
。然后,假设文本中的字符数为c
,那么您应该将文本分成多行,使得没有行包含多于floor(c/n)
个字符(您可以贪婪地做到这一点),我们称之为cPerLine
。 (请注意,您也可以使用动态编程为较少的“粗糙”(即线段长度之间的差异)执行“文字换行”,详情请参阅http://en.wikipedia.org/wiki/Word_wrap)
假设每个字符的平均宽度(取决于你使用的大小,你可能想要使用一个等宽字体,如Courier New)是w
像素。如果容器的宽度为x
,则可以轻松计算字符间距:floor(x/cPerline) - w
。您还需要考虑行间距,因此如果每个字符的平均高度为h
,并且容器的高度为y
,则类似地,行距应为floor(y/n) - h
。
希望这有助于任何方式。
Knuth-Plass专为您所描述的场景开发,因此应该可以使用。在简单性方面,总是假设现有的算法是最简单的,直到你完全理解了这个问题 - 计算机程序中的大部分复杂性都是出于某种原因而引入的。 – thiton 2011-12-17 12:12:47