![]() |
Eine Skala, die sich dem Bereich anpasst
Liste der Anhänge anzeigen (Anzahl: 1)
Zeichnet man Diagramme mit verschieden großen Bereichen, z.B. durch Zoomen, so entsteht das Problem, dass in einer zur Entwurfszeit festgelegten Skale die Striche auseinander bzw. zusammenrücken.
Es wird eine Skala benötigt, die sich dem Bereich so anpasst, dass der Strichabstand annähernd erhalten bleibt. Das beiliegende Demo erläutert was gemeint und enthält den Code. |
Re: Eine Skala, die sich dem Bereich anpasst
Hi!
Es wäre schön, wenn vllt. der Anfangs- und der Endpunkt immer beschriftet wären. (Nimm z.B. eine Skala von 11 bis 99 - min. Intervalllänge (<-- da fehlt dir ein l btw ;) ) 10, dann beginnt und endet die Skala im Nichts...) Außerdem habe ich noch nicht so ganz herausgefunden, wo hier etwas mit Zoomen stattfindet? Ciao, Frederic |
Re: Eine Skala, die sich dem Bereich anpasst
... mit Zoomen ist hier wohl eher der
Ausschnitt einer Funktion oder eines Funktionsgraphen gemeint, der dann entsteht, wenn X- und/oder Y-Parameter einer Skala oder eines Diagrammes bei unveränderter Funktion verändert werden. ..oder ??? |
Re: Eine Skala, die sich dem Bereich anpasst
Das ist richtig klasse (wie so ziemlich alle deine Beiträge) :hello:
@all: Es geht darum, dass die Skala stets "hübsch" aufgeteilt ist, egal in welchem Bereich die Werte liegen (quasi der Zoom). Beispiel: Ich habe Werte zwischen 0 und 256 und will auf der Achse ca. 10 Skalenstriche haben. Die herkömmliche und stupide Methode würde jetzt "25.6"-Intervalle wählen, also (25.5, 51, 76.5, ...), was natürlich doof aussieht und dem User wenig bringt. Diese Unit/Funktion hier errechnet aber stets gut ablesbare Intervalle, im Beispiel also "25" (25, 50, 75, ...). Dankeschön also dafür! :) |
Re: Eine Skala, die sich dem Bereich anpasst
Hallo,
Du könntest das Verfahren allgemeingültig machen, in dem Du Xa und Xe normierst, also auf Werte zwischen 0 und +9.99999 herunterrechnest. Nach der Ermittlung der geeigneten Skalierung rechnest Du die Ergebnisse einfach wieder zurück. Ein einfacher Ansatz würde so lauten, das man einen Faktor definiert, durch den man Xe und Xa teilt. Dieser Faktor würde sich an der 10er-Potenz von (Xe-Xa) sowie dem Vorzeichen orientieren. Weiterhin sollte der gewünschte Abstand zwischen den Ticks nicht in Pixeln, sondern z.B. als Anzahl (23 bis 1025 mit idealerweise 10 Ticks) angegeben werden. Auch das dient der Allgemeingültigkeit. In meinen Anwendungen benötige ich i.A. keinen Pixelabstand, sondern eben diese Anzahl an Ticks. Es wäre optimal, die XA und XE dahingehend zu korrigieren, das sie -entsprechend den Ticks- nach unten bzw. oben gerundet werden. Beispiel: Xa=10, Xe = 900 mit 10 Ticks => Tickabstand = 100. Dann wäre XA' = 0 und XE'=1000. Last, but not least zwei Anmerkungen zum Code: 1. Du verwendest globale Variablen, also wird das Verfahren von Anderen nicht ohne weiteres zu verwenden sein. 2. Du verwendest implizite Vorbedingungen, d.h. dein Verfahren arbeitet nur bei bestimmten Xa und Xe korrekt. Leider ist dies nicht dokumentiert, sondern ergibt sich zwangsweise durch die Formatierung der Eingabefelder. Es wäre schön, wenn Du dein Verfahren in eine Routine kapseln könntest, deren Prozedurkopf so aussehen könnte:
Delphi-Quellcode:
Procedure BereichSkalieren (XAnfang, XEnde : Extended; AnzahlTicks : Integer; Var XAnfangKorrigiert, XEndeKorrigiert, XTickAbstand : Extended);
|
Re: Eine Skala, die sich dem Bereich anpasst
"markus5766h"
Zitat:
|
Re: Eine Skala, die sich dem Bereich anpasst
"fkerber"
Zitat:
|
Re: Eine Skala, die sich dem Bereich anpasst
"alzaimar"
Zitat:
Entschuldige, so gern ich deine Beiträge lese, diesmal verstehe ich nur Bahnhof. |
Re: Eine Skala, die sich dem Bereich anpasst
Zitat:
Wenn Du meinen Beitrag aufmerksam gelesen, hast, müsste Dir mein einfaches Beispiel aufgefallen sein: Die Anzahl der gewünschten Unterteilungen (Tics). Wenn ich solche Achsen benötige, zeichne ich sie nur manchmal auf den Bildschirm. Manchmal zeichne ich sie auch per Hand auf ein Blatt Papier oder lasse es einen Plotter erledigen, die beide -wie bekannt- die Maßeinheit 'Pixel' nicht kennen. Und wenn ich sie in ein Fenster zeichne, möchte ich doch, das sich die Grafik der Fenstergröße anpasst, also kann ich keine konstante Anzahl von Pixeln angeben. Zudem versuche ich, meine Grafiken unabhängig von der Auflösung zu zeichnen. Sie sollen z.B. bildschirmfüllend sein, also sowohl auf einem 100x200 als auch auf einem 3000x4000 Bildschirm möglichst gleich aussehen: Wie soll das mit deinem Verfahren funktionieren? Aus diesen Gründen ist es mir egal, wie weit die Ticks auseinander liegen sollen. Ich definiere die Anzahl der Tics, die ich sehen will (normalerweise 6-12, wegen der Übersichtlichkeit), den Rest erledigt mein Achsenskalierer. Eigentlich ist mein Verfahren ganz einfach: 1. Normalisieren der XA und XE auf Werte zwischen 0 und 9.9999 2. Berechnen des gewünschten Abstandes in Einheiten: DX = (XE-XA)/Anzahl_gewünschter_Tics. 3. Anpassen von DX auf den nächsten Wert [0.1, 0.2, 0.25, 0.5, 1.0, 2.0, 2.5, 5.0] (=> DX') 4. Anpassen von XA' und XE', sodaß XA' = x * DX' (x = ganze Zahl und XA' <= XA mit größtem x). (XE' = y*DX mit XE'>=XE mit kleinstem y) 5. Hochrechnen von XA', XE' und DX' auf die Ursprungsgröße mit Hilfe des Faktors aus (1) |
Re: Eine Skala, die sich dem Bereich anpasst
"alzaimar"
Zitat:
Im übrigen erscheint es mir als hättest Du die Aufgabe nicht richtig erkannt. Es geht um eine Skala für ein vorhandenes Diagramm in den Grenzen Xa und Xe. Zur Festlegung des Strichabstandes durch die Anzahl der Striche. Das scheinst Du doch mit Ticks zu meinen (oder habe ich dich missverstanden?): Die Anzahl der Striche wäre den Bereich anzupassen! Eine Skala von 0.1 bis 0.9 mit 10 Ticks sähe wahrlich nicht gut aus. Eine Skala von 0.15 bis 0.33 wäre mit einer ganzzahligen Anzahl von Ticks kaum brauchbar zu erzeugen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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