вот как я бы это сделал в псевдокоде
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)
С этими двумя вы должны иметь приличное предположение для вашей коробки.
Возможно, вам придется сделать это, чтобы увидеть, и, возможно, пойтивверх или вниз на дополнительную строку или две, в зависимости от размера и допустимой погрешности.