AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Zitat:
Das mit dem Kerning schau ich mir mal genauer an... |
AW: Algorithmus - Zahlen auf Display zentrieren
nunja - verpixelt, da kommt es auch immer auf die Entfernung die Betrachter zum Display hat an.
Grüße Klaus |
AW: Algorithmus - Zahlen auf Display zentrieren
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
|
AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Hier mal mein bescheidener Beitrag (Zahl wird von rechts nach links gezeichnet). Die Kerninginfo steht im Array 'KerningCorrection'. Die '1' hinter einer '0' wird um 10 Pixel, die '7' hinter einer '0' um 6 pixel nach links verschoben,
Delphi-Quellcode:
Ungetestet.
Const
KerningCorrection : Array [0..9, 0..9] Of Integer = ( { 0 1 2 3 4 5 6 7 8 9} {0} ( 0,-10, 0, 0, 0, 0, 0, -6, 0, 0), {1} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {2} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {3} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {4} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {5} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {6} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {7} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {8} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), {9} ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ); Function CalcNumberWidth (Number : Integer) : Integer; Var Digit, DigitToTheRight : Integer; Begin Result := 0; DigitToTheRight := -1; Repeat Digit := Number mod 10; Number := Number div 10; Result := Result + GetDigitWidth(Digit,false) + GetKerningCorrection (Digit, DigitToTheRight); DigitToTheRight := Digit; Until Number=0; End; Procedure DrawNumberAt (LeftPos, Number : Integer); Var Digit, DigitToTheRight : Integer; Begin Repeat Digit := Number mod 10; Number := Number div 10; LeftPos := LeftPos - GetDigitWidth(Digit,false) + GetKerningCorrection (Digit, DigitToTheRight); DigitToTheRight := Digit; DrawDigitAt(LeftPos, Digit); Until Number=0; End; Function GetKerningCorrection (Digit, DigitToTheRight : Integer) : Integer; // > 0 add spacing, < 0 reduce spacing Begin If DigitToTheRight = -1 then result := 0 else result := AdditionalSpacing[Digit, DigitToTheRight]; End; Procedure DisplayNumber (Number : Integer; Alignment : TAlignment); Const DisplayWidth = 320; Var NumberWidth, LeftPos, i : Integer; Begin ClientConnect; Try NumberWidth := CalcNumberWidth(Number); case Alignment of taLeftAlignment: LeftPos := DisplayWidth - NumberWidth; taCenter: LeftPos := (DisplayWidth + NumberWidth) div 2; taRightAligment LeftPos := DisplayWidth; end; DrawNumberAt(LeftPos, Number); Finally ClientDisconnect End End; |
AW: Algorithmus - Zahlen auf Display zentrieren
Liste der Anhänge anzeigen (Anzahl: 1)
:shock::shock::shock: Wow, funktioniert auf anhieb! Dafür schon mal vielen vielen Dank!
Was noch nicht ganz funktioniert ist, dass die Kerning Correction beim zentrieren mit einberechnet wird (siehe Bild). Viele Grüße Croco |
AW: Algorithmus - Zahlen auf Display zentrieren
Hast Du denn eine Kerning-Korrektur für '01' oder nur für '10'. Bei der '1' ist links ein leerer Raum, und denn füllt man mit einem kleinen Teil des rechten Rands der '0'.
Ich würde eher sagen, das der Parameter für 'Alignment' auf taLeftAlignment steht bzw. der Wert von 'LeftPos' falsch ist. Vor dem Aufruf von DrawNumberAt muss er den rechten Rand des rechten Bitmaps (bei dir die '0') beschreiben. Die Breite sollte korrekt errechnet sein... Haaalt! Da ist ein kleiner Fehler.
Delphi-Quellcode:
Procedure DrawNumberAt (LeftPos, Number : Integer);
Var Digit, DigitToTheRight : Integer; Begin DigitToTheRight := -1; // <<<<<< FEHLT! Repeat ... |
AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Delphi-Quellcode:
Das Alignment steht auf taCenter. Es wird auch zentriert, wenn ich die -20 durch eine 0 ersetze.
{1} ( 0, -20, 0, 0, 0, 0, 0, 0, 0, 0),
Zitat:
|
AW: Algorithmus - Zahlen auf Display zentrieren
Habs! Abs ist das Stichwort ;)
Delphi-Quellcode:
function TWartezeit.CalcNumberWidth(aNumber: integer): integer;
var Digit, DigitToTheRight : Integer; begin Result:= 0; DigitToTheRight:= -1; repeat Digit:= aNumber mod 10; aNumber:= aNumber div 10; Result:= Result + GetDigitWidth(Digit,false) + Abs(GetKerningCorrection(Digit, DigitToTheRight)); // <- hier würde sonst die Breite verringert werden DigitToTheRight:= Digit; until aNumber=0; end; |
AW: Algorithmus - Zahlen auf Display zentrieren
Nein nein. Steht eine '1' rechts von einer '0', soll die '0' etwas nach links rutschen. Das geschieht, indem die '0' dann etwas schmaler wird. Vielleicht habe ich die Vorzeichen in der KerningCorrection-Matrix vertauscht. Ich hatte es ja nicht getestet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz