Поиск наибольшего размера шрифта для помещения текста в область

Есть текст. В нём есть строчки. Происходит следующее: если строчка не меньше, чем w, её делят на несколько строчек короче w так, чтобы не пришлось переносить слова. Как найти максимальный размер шрифта для такой строчки, при котором количество строк, умноженное на размер шрифта, не превосходит h?

Я написал кривой алгоритм, который, по сути, сводит задачу к поиску всех таких размеров s шрифта для одной строчки, при которой шрифт на единицу меньшего размера (s-1) позволит поделить её на строчки, количество которых на одну меньше (чем со шрифтом s).

Код:

private void updateFont(){
        if(getDocument()==null)return;
        FontMetrics fm=getFontMetrics(maxFont);
        TreeSet<Integer>m=new TreeSet<Integer>();
        for(String t:getText().split("\n")){
            int r=0,l=0;
            for(String p:t.split(" ")){
                int a=fm.stringWidth(p);
                r+=a;
                if(r>getWidth()){++l;r=a;}
            }
            int b=maxFont.getSize();
            for(int i=l-1;i>0;i--){
                int a=0;
                //TODO: find optimal algorythm
            }
        }
        int l=0;
        for(int f:m){
            ++l;
            if(getHeight()/getFontMetrics(maxFont.deriveFont(f)).getHeight()>l){
                setFont(maxFont.deriveFont(f-1));
                break;
            }
        }
    }

По сути, я хочу найти максимально возможно большой шрифт такой, чтобы он уместился на JTextArea с setLineWrap(true) и setWrapStyleWords(true) притом, желательно, без перебора, но, кажется, эта задача слишком сложна для меня.

Пожалуйста, помогите найти оптимальный алгоритм.

ПРАВКА: В своём недописанном решении (см. отредактированный вопрос) я пытался обозначить "точки" (значения размеров), где количество строчек становится больше, и после этого пройтись по ним и найти максимальный допустимый.
Моё желание найти алгоритм быстрее, чем бинарный поиск обусловлено частыми вызовами метода, в котором исполняется код, и стремлением к поддержке низкопроизводительных устройств.


Ответы (1 шт):

Автор решения: MBo

Количество строк зависит от размера шрифта нелинейно, но монотонно, поэтому для сокращения количества разбиений и проверок можно воспользоваться бинарным поиском по размеру шрифта.

→ Ссылка