Как бы вы вычислили размер шрифта шрифта, необходимый для наилучшего соответствия предопределенной области? - PullRequest
3 голосов
/ 24 сентября 2010

У меня интересная проблема. Я почти там, но мне любопытно, как другие справятся с этим. Я хочу отобразить несколько многострочных текста в заранее определенной области. Я не знаю, какой будет текст или насколько большой будет площадь, поэтому эту функцию нужно было бы написать в общем виде. Можно предположить, что всегда используется стандартный шрифт, но размер точки - это то, что должно измениться.

Предположим, у вас есть функция, которая будет рисовать текст, который передается ей в виде строкового параметра. Функция имеет объект формы для рисования, а также передается прямоугольный объект, определяющий ограничивающую область текста в форме. Функция должна отображать текст на форме в заданном прямоугольнике в таком большом шрифте, который будет соответствовать. Задача для меня заключалась в том, чтобы рассчитать размер шрифта, который нужно использовать, чтобы текст соответствовал как можно лучше, в прямоугольнике с минимальным пробелом.

Эти 2 уравнения могут быть полезны:

float pixels = (points *dpi)/72f;
float points = (pixels*72f)/dpi);

Также:

float dpi = CreateGraphics().DpiY;

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

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

Я бы порекомендовал вам начать с бинарного поиска, установив hi и lo на разумные значения по умолчанию, такие как 72 и 6. Затем, когда диапазон сужается до, скажем,5 баллов, начните тестировать каждый отдельный размер, пока не найдете самый большой, который подходит.Когда вы пишете алгоритм, убедитесь, что вы рассчитываете на размер N, который подходит, но размер N-1, который не подходит.

2 голосов
/ 24 сентября 2010

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

Решение не будет быстрым, если вы хотите, чтобы оно было точным.

Я бы предложил выбрать два размера точек (скажем, 6 и 18), которые представляют наименьшую и среднюю и верхнюю точки и вычисляют ширину пикселя каждого слова в каждом размере точки. Затем вы можете вычислить площадь текста обоих размеров.

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

Затем вам нужно будет итеративно пытаться переносить слова внутри прямоугольника и работать в обратном направлении в размере точки, пока текст не уместится в прямоугольнике.

0 голосов
/ 24 сентября 2010

бинарный поиск по размерам точек: Начните с самого большого доступного размера точки. Если это не подходит, попробуйте половину этого, ...

...