Как рассчитать ширину ограничивающего прямоугольника для текста, обернутого для соответствия определенному соотношению? - PullRequest
2 голосов
/ 20 февраля 2011

Если у меня есть следующий текст:

«Здравствуйте, это фрагмент текста, который будет отображаться в прямоугольной области экрана»

Я знаю общую ширину текста.

Я пытаюсь найти ограничивающую ширину для переноса текста на основе заданного соотношения.

Какой алгоритм?

Например, я хочу всегда пытаться обернуть текст по ширине и высоте, где ограничивающий прямоугольник имеет соотношение 16: 9. Это должно происходить при любой длине текста.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2011

вот как я бы это сделал в псевдокоде

function calcWidth(string text, int rows, float ratio)

    let H be int with value /* how many pixels high is a row? */
    let total_width be int with value 0
    for each character c in string text
        let total_width be total_width + pixel_width(c)
    end for

    let W = total_width / length(text)

    /* RATIO = (H * row) / (W * col) */
    /* means col = (H * row) / (W * RATIO) */

    let cols be int with value (H * rows) / (W * ratio)

    return cols
end function

Я мог бы также поставить там проверку, что если 5 строк было неприемлемо, но 6 строк было хуже, я знаю, что 5 лучше, чем 6, поэтомув этом случае я бы вернул 5.

Давайте посмотрим, что мы знаем

Для моноширинного шрифта:

    H * rows
   ---------- = RATIO
    W * cols

Теперь мы знаем, что столбцы не будут такими жедля каждого ряда, потому что мы могли бы не моноширинный.Однако мы можем приблизить столбцы к общему количеству букв, деленному на количество строк.

        H * rows
    -------------- = RATIO
    W * len / rows

      H * rows^2
    -------------- = RATIO
       W * len

Теперь вы знаете все эти переменные, кроме строк, поэтому решите для строк

   rows = roundUp ( SQRT (  (RATIO * W * len) / h ) )

Теперь мы знаем сверху, что cols составляет приблизительно

   cols = (H * rows) / (W * ratio)

С этими двумя вы должны иметь приличное предположение для вашей коробки.

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

0 голосов
/ 20 февраля 2011

Поскольку длина слова непредсказуема, я думаю, что нет лучшего подхода, чем генерация и тестирование. Вы можете начать с нахождения границы слова, которая, скажем, 9/16-го пути в тексте и использовать ширину до этой точки в качестве ширины кандидата. Затем итеративно оберните весь текст, измерьте результат и сдвиньте первую границу на одно слово влево или вправо, пока не подойдете как можно ближе. Это дает вам оптимальный разрыв для первой строки и верхних и нижних границ (на одно слово больше или на одно слово меньше), в пределах которых вы можете, если хотите, продолжить поиск оптимального решения с помощью, возможно, двоичного поиска.

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