Перенос слов в текст по размеру прямоугольника (не по размеру) - PullRequest
2 голосов
/ 16 ноября 2010

Любой знает алгоритм, который может разбивать текст на границах слов, чтобы соответствовать прямоугольнику определенного приблизительного отношения - например, 60:40 (ширина: высота)?

Обратите внимание, что это не просто ширина (например, 80 символов или 600 пикселей и т. Д.), А произвольная высота, которая исключает все алгоритмы переноса слов, которые я могу найти.

Бонусные баллы за javascript, но это больше об алгоритме, чем о его реализации.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Это может сделать это:

int lineHeight := getHeightOfTextLine()
int lines := 0
do {
  lines += 1
  int width = lines * lineHeight * ratio
  String wrappedText := break(input, width)
} while(getNumberOfLines(wrappedText) != lines)

Начиная с одной строки, я просто проверяю для каждой высоты (кратно lineHeight), если у меня есть прямоугольник с заданным соотношением, которое может содержать текст.Если разрыв текста на рассчитанной ширине приводит к строке с большим количеством строк, чем разрешено (для прогона), продолжайте, в противном случае у меня есть решение.

1 голос
/ 16 ноября 2010

Что ж, если вы начнете с массива высоты и ширины для каждого слова, вам нужно будет использовать несколько возможностей, пока вы не найдете минимальный мусор (пространство между словами и) для данной ширины: высота

Обычно вы начинаете с

ratio := 6 / 4
noOfLines := totalWidth / ( ratio * lineHeight )
targetLineWidth := totalWidth / noOfLines

и затем пытаетесь определить, после каких слов вы ставите разрывы строк, чтобы минимизировать пробел между словами.

Если вы пытаетесь минимизировать пробел в каждой строкеВы можете получить дополнительное место в последней строке.Если вы сначала убедитесь, что даже последняя строка равномерно распределена, то вам следует изучить всего несколько вариантов.

РЕДАКТИРОВАТЬ
Если вы хотите использовать точные метрики шрифта этот вопрос выглядит полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...