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