Я ищу алгоритм для обертывания текста в непрямоугольной форме, предпочтительно на основе алгоритма Knuth и Plass. Самая твердая часть этого - то, что строки могут иметь различные высоты из-за отличающихся размеров шрифта в тексте. Изображение ниже является примером того, что алгоритм должен смочь генерировать.
Для простого алгоритма предположим, что вы можете вычислить ограничивающую рамку вокруг каждого слова, и что у вас есть изображение с маской формы, которую вы хотите заполнить.
Проведите линию вниз от верхней части маски изображения, пока не найдете линию длиной с первое слово. Посмотрите, можно ли продлить ее вниз до прямоугольника размером с ограничительную рамку. Если да, опустите первое слово туда. Если нет, продолжайте прочесывать.
Как только вы опустите слово, посмотрите, можете ли вы расширить ограничивающую рамку до ширины (первая рамка + вторая рамка + пробел) и высоты max(первая рамка, вторая рамка). Если да, поместите туда второе слово. Если нет, отцентрируйте первое слово слева направо в пределах ограничительной рамки, которая поместится в маску изображения (слева направо), удалите эту ограничительную рамку из маски и продолжайте.
Вы можете сделать это немного сложнее, настаивая на том, чтобы линии имели одну и ту же базовую линию, даже если они нарушены формой (например, линии через верхние бугорки сердца); тогда вам нужно иметь альтернативное условие "продолжать вдоль этой базовой линии". Но основная идея, описанная выше, с маской изображения, которую вы используете, чтобы попытаться вписать прямоугольники внутрь, и которая удаляется, когда вы закончите, сделает свою работу.
(Использовать геометрические операции быстрее, чем пиксельные, описанные здесь, но тогда приходится беспокоиться обо всех случаях, когда нужно выяснить, как ограничивающая рамка вписывается в произвольный многоугольник, а это слишком долго объяснять здесь)
.