Поместить текст в контейнер - PullRequest
1 голос
/ 17 декабря 2011

Есть текст (возможно, довольно длинный).И есть контейнер высоты и ширины.Как сделать так, чтобы текст (все это) соответствовал контейнеру?Можно только настроить межсимвольный интервал (кернинг) и межсловный интервал.Меня не волнует, будет ли текст слишком упакованным - я просто хочу, чтобы все это было внутри.

Чтобы перефразировать вопрос, мне нужен эффективный алгоритм для разрыва строки, где стоимость ""упакованность строк".

Я знаю об алгоритме Кнута-Пласса, который используется в TeX, но его довольно сложно реализовать, и я даже не уверен, что его можно использовать в этом сценарии.Я также мог бы использовать генетический алгоритм, но это может быть излишним.

1 Ответ

0 голосов
/ 03 января 2012

Вот идея.

Прежде всего, оцените, сколько строк вы хотите, чтобы текст был, пусть это число будет 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.

Надеюсь, это помогло.

...