![]() |
Algorithmus - Zahlen auf Display zentrieren
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich suche nach einem Algorythmus, der mir 1,2 und 3-Stellige Zahlen auf einem Display zentriert. Dabei soll das ganze auch harmonisch aussehen (Abstände zwischen den Zahlen). Es handelt sich um ein "EA eDIP320-8" Display, dass ich mittels XPort ansteuer. Ich zeig euch einfach mal meinen Ansatz, das erklärt's besser als eine schriftliche Beschreibung:
Delphi-Quellcode:
So hab ich mir das ganze überlegt, funktioniert aber nicht immer. Natürlich könnte ich einfach auf bestimme Zahlenlängen abfragen, aber ich brauche was universelles, was auch im Falle eines größeren Display funktionieren würde.
function DisplayDigit(aNumbers: integer): boolean;
const DspWidth=320; // Breite des Displays var cText: string; n, nLeft: integer; nTmp: integer; DWidth, DWidthSum: integer; Numbers: array of integer; begin ClientConnect; DWidthSum:=0; // Breite aller Zahlen SetLength(Numbers,Length(inttostr(aNumbers))); for n:= Low(Numbers) to High(Numbers) do begin Numbers[n]:= StrToInt(inttostr(aNumbers)[n+1]); DWidthSum:= DWidthSum+GetDigitWidth(Numbers[n],false); // Die Funktion GetDigitWidth läd das Bitmap-File ein und list die Breite aus end; if DWidthSum < DspWidth then // Falls die Display-Breite nicht ausgenutzt wird, dann das Übrige später als Rand aufaddieren begin nTmp:= Round((DWidthSum-DspWidth)/(High(Numbers)+1)); end; for n:= High(Numbers) downto Low(Numbers) do // Hier wird Zahl für Zahl das Display mit den Bitmaps beschriftet begin DWidth:= GetDigitWidth(Numbers[n],false); // Breite des aktuellen Digits nLeft:= Round(DWidthSum-(DWidth/(High(Numbers)+1)))-Round(DWidth/2); nLeft:= nLeft+nTmp; SendText2Dsp(nLeft,...); DWidthSum:= (DWidthSum - DWidth); end; ClientDisconnect; end; Im Anhang könnt ihr das Ergebnis der Funktion sehen. Hat von euch jemand eine Idee wie ich das lösen kann? Viele Grüße Croco |
AW: Algorithmus - Zahlen auf Display zentrieren
Hast Du es schon mal mit der Positionierung eines Strings statt der einzelnen Ziffern versucht?
Gruß K-H |
AW: Algorithmus - Zahlen auf Display zentrieren
Scherzkeks. Hat schon einen Grund warum ich eine Zahl mit Bitmaps darstelle :P Die eigenen Ziffern sind auf maximaler Größe maximal verpixelt ^^
|
AW: Algorythmus - Zahlen auf Display zentrieren
So wie du eine GetDigitWidth()-Funktion hast solltest du auch eine GetTextWidth()-Funktion erstellen.
Ausserdem willst du vielleicht ja auch mal Buchstaben darstellen; also nicht nur Digits.
Delphi-Quellcode:
Der Parameter "spacing" ist der Zeichenabstand in Pixel.
function GetCharWidth(c:Char):Integer;
function GetTextWidth(const s:string; spacing:integer=0):Integer; procedure DisplayText(const s:string; p:TPoint; spacing:integer=0); (könnte man auch weglassen, denn man kann die zusätzliche Breite auch aus so ausrechnen (AnzahlZeichen-1)*spacing = Totalspacing)) Der maximale Wert für "spacing" sollte nicht mehr als 60% der Buchstabenhöhe betragen; ansonsten entsteht ein S p e r r t e x t. Ein einfacher Algorithmus wäre mit dem maximalen spacing zu beginnen und zu prüfen, ob der Text in die vorgesehene Breite passt und ausserdem ein Rand links+rechts von mindestens 4 * spacing übrig bleibt. Falls zu wenig Rand übrig dann spacing verkleinern und erneut rechnen. Wichtig sind auf jeden Fall die Funktionen von oben, denn erst wenn man so nützliche Hilfsfunktionen hat kann man sich auch den Algorithmus stürzen. |
AW: Algorithmus - Zahlen auf Display zentrieren
Es sind Bitmaps die ich darstelle, keine Strings. Wenn die die Ziffer 2-Stellig ist, brauche ich 2 Bitmaps.
|
AW: Algorithmus - Zahlen auf Display zentrieren
Du könntest das Problem vereinfachen, indem Du die Ziffern-Bitmaps so gestaltest, das alle Ziffern gleich breit sind. Das ist sowieso eine anzustrebende Maßnahme, weil bei ungleicher Ziffernbreite und z.B. aufsteigendem Zähler die Zahl sonst hin und her wackelt.
Für Buchstaben gilt das natürlich nur bedingt. |
AW: Algorithmus - Zahlen auf Display zentrieren
Das hab ich am Anfang genau so gemacht, nur hat sich dann ein optisches Problem ergeben. Wenn z.B. eine 11 angezeigt wird, dann sieht das total verkrüppelt aus, da die Einsen entweder viel zu nah aneinander oder viel zu weit weg von einander sind. Deshalb ist ein Bitmap immer nur genau so groß, wie die Zahl selbst.
Buchstaben werde ich nie anzeigen müssen |
AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Das Stichwort heißt ![]() Ich würde eine 10x10 Matrix erstellen, in denen die Unterschneidungen für jedes Ziffernpaar gespeichert ist. Wenn es nötig ist, könnte man noch eine (unsichtbare) Pseudoziffer mit betrachten, welche am Anfang und Ende jeder Zahl steht und die Zentrierung anpasst (dann also 11x11 Matrix). |
AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Allerdings kann ich dein ästhetisches Naserümpfen nachvollziehen, allerdings zappelt die Anzeige dann hin und her (fände ich persönlich grauenvoll). |
AW: Algorithmus - Zahlen auf Display zentrieren
Zitat:
Allerdings kann ich dein ästhetisches Naserümpfen nachvollziehen, aber dann zappelt die Anzeige eben hin und her (fände ich persönlich grauenvoll). Außer... Zitat:
Bei der Kerning-Geschichte reicht vermutlich die Aufzählung der Ausnahmen ('01' fällt mir auf Anhieb ein, eventuell '07'. '11' vielleicht negativ, aber das wars dann im Groben). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz