Алгоритм для переноса текста в форме

Я ищу алгоритм для обертывания текста в непрямоугольной форме, предпочтительно на основе алгоритма Knuth и Plass. Самая твердая часть этого - то, что строки могут иметь различные высоты из-за отличающихся размеров шрифта в тексте. Изображение ниже является примером того, что алгоритм должен смочь генерировать.

Text shaped like a heart

23
задан totymedli 15 October 2017 в 00:28
поделиться

1 ответ

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

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

Как только вы опустите слово, посмотрите, можете ли вы расширить ограничивающую рамку до ширины (первая рамка + вторая рамка + пробел) и высоты max(первая рамка, вторая рамка). Если да, поместите туда второе слово. Если нет, отцентрируйте первое слово слева направо в пределах ограничительной рамки, которая поместится в маску изображения (слева направо), удалите эту ограничительную рамку из маски и продолжайте.

Вы можете сделать это немного сложнее, настаивая на том, чтобы линии имели одну и ту же базовую линию, даже если они нарушены формой (например, линии через верхние бугорки сердца); тогда вам нужно иметь альтернативное условие "продолжать вдоль этой базовой линии". Но основная идея, описанная выше, с маской изображения, которую вы используете, чтобы попытаться вписать прямоугольники внутрь, и которая удаляется, когда вы закончите, сделает свою работу.

(Использовать геометрические операции быстрее, чем пиксельные, описанные здесь, но тогда приходится беспокоиться обо всех случаях, когда нужно выяснить, как ограничивающая рамка вписывается в произвольный многоугольник, а это слишком долго объяснять здесь)

.
4
ответ дан 29 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: