Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Eine Skala, die sich dem Bereich anpasst (https://www.delphipraxis.net/134197-eine-skala-die-sich-dem-bereich-anpasst.html)

Dipl Phys Ernst Winter 17. Mai 2009 17:37


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.

fkerber 24. Mai 2009 14:31

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

markus5766h 24. Mai 2009 14:37

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 ???

Florian H 24. Mai 2009 15:17

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! :)

alzaimar 24. Mai 2009 16:32

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);

Dipl Phys Ernst Winter 24. Mai 2009 22:41

Re: Eine Skala, die sich dem Bereich anpasst
 
"markus5766h"
Zitat:

... mit Zoomen ist hier wohl eher der Ausschnitt ... eines Funktionsgraphen gemeint
Genau! Was verstehst Du sonst unter Zoomen?

Dipl Phys Ernst Winter 24. Mai 2009 22:56

Re: Eine Skala, die sich dem Bereich anpasst
 
"fkerber"
Zitat:

Es wäre schön, wenn vllt. der Anfangs- und der Endpunkt immer beschriftet wären.
Anfangs- und Endpunkt liegen, wenn man nicht runde Werte nimmt, im allgemeinen zwischen den Strichen einer Skala, sie können daher nicht beschriftet werden. Selbst wenn Anfangs- und Endwert mit einem Strich zusammenfallen sähe es schlecht aus, wenn sie mit Werten beschriftet wären, die nicht ins Raster passen.

Dipl Phys Ernst Winter 24. Mai 2009 23:00

Re: Eine Skala, die sich dem Bereich anpasst
 
"alzaimar"
Zitat:

Weiterhin sollte der gewünschte Abstand zwischen den Ticks nicht in Pixeln,
Der gewünschte Abstand ist eine Strecke auf dem Bildschirm, ich kenne hierfür kein anderes Maß als Pixel.
Entschuldige, so gern ich deine Beiträge lese, diesmal verstehe ich nur Bahnhof.

alzaimar 25. Mai 2009 04:52

Re: Eine Skala, die sich dem Bereich anpasst
 
Zitat:

Zitat von Dipl Phys Ernst Winter
Der gewünschte Abstand ist eine Strecke auf dem Bildschirm, ich kenne hierfür kein anderes Maß als Pixel.
Entschuldige, so gern ich deine Beiträge lese, diesmal verstehe ich nur Bahnhof.

Also ich kenne noch 'cm', 'mm' usw. :zwinker: Zudem ist ein 'Pixel' keine Maßeinheit, sondern die Bezeichnung für einen digitalen Bildpunkt.
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)

Dipl Phys Ernst Winter 25. Mai 2009 10:11

Re: Eine Skala, die sich dem Bereich anpasst
 
"alzaimar"
Zitat:

Der gewünschte Abstand ist eine Strecke auf dem Bildschirm, ich kenne hierfür kein anderes Maß als Pixel.
Also ich kenne noch 'cm', 'mm' usw.
Die hängen jedoch von der Größe des Bildschirmes ab.

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 22:12 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