AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Eine Skala, die sich dem Bereich anpasst
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Skala, die sich dem Bereich anpasst

Ein Thema von Dipl Phys Ernst Winter · begonnen am 17. Mai 2009 · letzter Beitrag vom 25. Mai 2009
Antwort Antwort
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#1

Eine Skala, die sich dem Bereich anpasst

  Alt 17. Mai 2009, 18:37
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.
Angehängte Dateien
Dateityp: zip skala_122.zip (134,0 KB, 69x aufgerufen)
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#2

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 15:31
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
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#3

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 15:37
... 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 ???
Markus H.
  Mit Zitat antworten Zitat
Florian H

Registriert seit: 30. Mär 2003
Ort: Mühlacker
1.043 Beiträge
 
Delphi 6 Professional
 
#4

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 16:17
Das ist richtig klasse (wie so ziemlich alle deine Beiträge)

@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!
Florian Heft
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 17:32
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:
Procedure BereichSkalieren (XAnfang, XEnde : Extended; AnzahlTicks : Integer; Var XAnfangKorrigiert, XEndeKorrigiert, XTickAbstand : Extended);
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#6

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 23:41
"markus5766h"
Zitat:
... mit Zoomen ist hier wohl eher der Ausschnitt ... eines Funktionsgraphen gemeint
Genau! Was verstehst Du sonst unter Zoomen?
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#7

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 24. Mai 2009, 23:56
"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.
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#8

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 25. Mai 2009, 00:00
"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.
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 25. Mai 2009, 05:52
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. 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)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Dipl Phys Ernst Winter

Registriert seit: 14. Apr 2009
Ort: Jena
103 Beiträge
 
Delphi 3 Professional
 
#10

Re: Eine Skala, die sich dem Bereich anpasst

  Alt 25. Mai 2009, 11:11
"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.
Autor: DP Ernst Winter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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