Miglioramento del metodo di bisezione o dell'algoritmo alternativo per la determinazione efficiente della dimensione del carattere del testo per adattarsi a una casella

4

Ho bisogno di trovare la dimensione del carattere di un testo che rientra in una scatola.

Data la mia dimensione attuale del carattere, posso ottenere il rettangolo di delimitazione del testo.

Se imposto alcune dimensioni minime e massime del font, suppongo di poter incrementare o decrementare la dimensione del mio carattere fino a quando non arrivo alla casella specificata.

Sto pensando al metodo di bisezione:

ChangeFontMethod(float currentFont, float reqWidth)

    float minFont = 1, maxFont = 1000
    int tolerance = 0.001, maxIter = 1000 
    int n = 1

    float currentWidth = textWithCurrentFont.boundingRect.Width

    do
        if currentWidth = reqWidth
            break
        else if currentWidth < reqWidth
            minFont = currentFont
        else
            maxFont = currentFont

        if maxFont - minFont < tolerance 
            break

        currentFont = (minFont + maxFont)/2
        currentWidth = textWithCurrentFont.boundingRect.Width
        n++

    while n <= maxIter

    return currentFont

Da quello che ho letto dovrebbe avere una velocità logaritmica, ma ho anche letto che è "lento"

C'è un modo migliore?

Non so se posso migliorare la mia ricerca assumendo una relazione tra la dimensione del font e la larghezza del font - sicuramente ce n'è una, ma non è lineare. Quindi non so come migliorare la velocità con una "prima ipotesi" migliore

    
posta Thalia 01.07.2015 - 17:09
fonte

1 risposta

3

Non ho intenzione di codificarlo ma ti darò un approccio matematico. Supponendo che tu conosca la larghezza risultante con due diverse dimensioni dei caratteri:
la dimensione del carattere 1 (s1) implica la larghezza del testo 1 (w1) (il valore piccolo)
la dimensione del carattere 2 (s2) implica la larghezza del testo 2 (w2) (il valore maggiore)
quindi la stima lineare della dimensione (s3) che si adatta alla larghezza richiesta (w) viene dall'utilizzo di questa formula:
(S3-s1) / (s2-s1) = (w-W1) / (w2-W1)
così la stima della larghezza corretta è
s3 = s1 + (w-w1) * (s2-s1) / (w2-w1)

ora controlli w3 (la larghezza quando usi s3). Se w < w3 quindi ripeti il metodo ma usando s1, w1, s3, w3 se w > w3 quindi ripeti il metodo ma usando s3, w3, s2, w2.
Questo approccio iterativo richiede solo che la larghezza per un dato testo sia una funzione monotona della dimensione del carattere, in altre parole non importa se lineare ma convergerà più velocemente se la funzione è più vicina a lineare, quindi accelererà la convergenza come la gamma di dimensioni dei caratteri si riduce.

    
risposta data 01.07.2015 - 19:42
fonte

Leggi altre domande sui tag