Ik heb de fout gevondenSoultaker schreef op donderdag 26 januari 2012 @ 18:02:
Ik laat het aan jou om de fouten in je code te vinden.
Perl:
1
| my $fsize = floor(sqrt(($w*$h)/(length(join(' ',@values))))); #approximate font size |
De eerste fout was het gebruik van floor, terwijl ceil veel mee voor de hand ligt. Als ik dat aanpas, dan kreeg ik wel de juiste resultaten met het door jouw gegeven voorbeeld:
code:
1
| 50 20 a b c d e f |
Dit print nu netjes 10 ipv 9. Het probleem lag in het feit dat mijn geschatte font-size geen rekening hield met 2 invloeden op de font-size, die de daadwerkelijke code daarna wel heeft. Namelijk:
1 - Houd geen rekening met het wegvallen van spaties aan het einde van een zin. Daardoor wordt er minder ruimte gebruikt, waardoor de werkelijke font-size groter wordt dan de geschatte font-size.
2 - Houd geen rekening met het niet afbreken van woorden. Daardoor wordt er ruimte niet gebruikt voor karakters, waardoor de werkelijke font-size kleiner wordt dan de geschatte font-size.
Over het algemeen heeft 2 meer invloed dan 1, waardoor de geschatte font grootte iets hoger ligt dan de werkelijke font grootte, echter in jou voorbeeld heeft 2 geen invloed, maar 1 des te meer. Met ceil ging het dus wel goed, maar daarna ben ik voorbeelden gaan verzinnen die evengoed nog fout konden gaan.
code:
1
| 30 40 aba a a aba a a |
Met ceil wordt er toch 9 geprint ipv het juiste getal 10 (de schatting is 8.9 oid). Daarna heb ik nagedacht hoe ik de berekening kon verbeteren, maar daar kwam ik niet uit.
Dus toen even googlen, en ik kwam uit op deze oplossing, geschreven in python. Hier wordt ook een schatting gemaakt, maar op een andere manier, namelijk de breedte delen door het aantal karakters van het langste woord. Stel de breedte is 30, en het langste woord is ook 30, dan is de geschatte font grootte 1, wat ook klopt. Uiteindelijk is de schatting dus geworden:
Perl:
1
| my $fsize = ceil($w/(max(map(length,@values)))); #approximate font size |
Dit werkt wel, maar heeft als nadeel dat de geschatte waarde soms ver af ligt van de eigenlijk waarde, waardoor er toch veel iteraties nodig zijn.
Ik vraag mij af of mijn oorspronkelijke manier is aan te passen zodat deze wel klopt? Want die zit er altijd erg dichtbij.
Bedankt voor het de juiste richting op duwen soultaker, ik zal eens kijken naar auction, maar ik vrees dat die te hoog gegrepen is
Code staat hier .
offtopic:
En ik zal nog even testen in practice mode of hij nu wel klopt, das nog niet zeker.
En ik zal nog even testen in practice mode of hij nu wel klopt, das nog niet zeker.