Algorithmus für Zeitraumeinteilung gesucht!

P

polo_krausi

Hallo,

Vorgeschichte:
Ich habe eine Tabelle mit Maschinendaten. die Maschinen nehmen während der Auftragslaufzeit verschiedene Zustände an. Diese Zeiträume habe ich bereits gespeichert.

Nun muss ich diesen Auftragsverlauf jedoch graphisch darstellen. Ich habe zB 400 pixel Breite für das Bild zur Verfügung.
Gibt der User nun einen Zeitraum von zB. 4000 Stunden ein, so habe ich pro 10 Stunden nur 1 pixel für die farcodierte Darstellung des Zustandes zur Verfügung. Es kann jedoch auch sein, dass der User nur einen Zeitaum von 4 Stunden eingibt.
Ich brauch nun also einen Algorithmus der mir die darstellbare Mindestauflösung auf die Zeiträume umsetzt.
Es kann ja nun sein, dass die Mindestauflösung 5 Minuten beträgt aber der Zustand mitten drin 4 Minuten dauert. Dann muss als der 4 Minuten-Zustand mit seiner Farbe dargestellt werden und die restlichte Minute muss dann leider unter den Tisch fallen.

Ich hoffe ich habe das komplexe Problem verständlich dargestellt. Wahrscheinlich sehe ich dne Wald vor lauter bäumen nicht. Ich komm einfach auf keine Lösung.

Hat wer einen Algorithmus für das Problem parat?

Wäre super

Grüsse

Matthias
 
Ich bin mir nicht sicher, ob ich das Problem verstanden habe.

Als Eingabe hast du also eine Gesamtzeit (gesamtT), eine "Gesamtlänge" (gesamtL) der Darstellung und eben ein Array von Teilzeiten (*t mit Füllhöhe countT), richtig?
Erstmal musst du natürlich alles auf einen Nenner bringen.
Ich würde alles in Sekunden bzw Pixel umrechnen.

Wenn du dann die Gesamtlänge durch die Gesamtzeit teilst, hast du die Länge für eine Sekunde (deltaL).
Diesen Wert musst du nur noch mit den Teilzeiten multipilzieren und du hast ihre Länge.

Pseudocode:
Code:
Eingabe: gesamtL, gesamtT, *t, countT

deltaL = gesamtL / gesamtT

for i=0; i<countT; i++
  Abschnittlänge = aufrunden(t[i]*deltaL)

Ich hoffe, ich habe dein Problem richtig verstanden.

Gruß
Mueslirocker
 
Ja, das ist der berühmte Dreisatz, auch Verhältnisrechnung genannt.
Ich würde strategisch so vorgehen, wenn die Grafik am Bildschirm ausgegeben werden sollte:
Man verwende die technisch kleinstmögliche Zeiteinheit als Basis, auf der alles berechnet werden kann, um die eigetnlich gewollten fachlichen Granularitäten (Zeiteinheiten) später im Programm einfach durch Konstanten, die als Faktoren dienen, abzubilden.
Nehmen wir mal an, dass der User einen Zeitraum verwenden will. der schlichtweg nicht ins Fenster passt, muss entsprechend ausgezoomt oder aber gescrollt werden. Nehmen wir mal an, das der User einen sehr kleinen Zeitausschnitt wählt muss entprechend eingezoomt werden, so dass z.B. die Sekunden z.B. nicht mehr 1 pixel sondern 20 Pixel groß sein könnten.

Wenn man z.B. Gantdiagramme darstellen möchte, (zeitlich abhänge Werte von bestimmten Attributen bzw Variablen) Kann eine fachlich sinnvolle Granularität z.B. ein Tag, eine Woche oder ein Monat etc sein, vielleicht aber auch eine Stunden, Minuten, Sekunden.
Diese fachliche Granularität müsste man also wie oben skizziert als einen Faktor auf die technisch kleinste Granularität, die natürlich vom technischen Umfeld abhängig ist (z.B. Microsekunde) anwenden. In der Anwendung könnte man dann z.B. einen wie auch immer gearteten Schalter auf diese Granularitäten dem Anwender zur Verfügung stellen.

Man hat also eigetnlich mehere Parameter:
Die Größe der Darstellungsfläche(in Pixel), die jedoch, so es das Programm-Umfeld ermöglicht auch durch scrollen variable gesstaltet werden könnte
einen Zeitraum der vom User bestimmt wird
Eine Granularität, die man entweder dem User auswählen lässt, oder aber durch das Grafikaumaß in Abhängigkeit der zur Verfügung steheneden Datstellungsfläche gesteuert vom Programm auswählen lässt.

Ach ja noch ein Tipp, versuche bei den Berechnungen immer mit den genauesten Fließkommazahlen (z.B. double in Java) Deiner Entwicklungsumgebung zu rechenen und konvertiere erst am Ende für die Darstellung in Ganzzahlen. (z.B. int in Java) Du wirst Dich sonst über die Darstellungsfehler wundern, die auf Rundungsfehlern vermutlich zurückzuführen wären.

vielleicht half das als Gedankenanregung.

Takidoso
 
was mir noch sehr wichtig erscheint als Tip:
Wenn Du in einem objektorientierten Umfeld arbeiten solltest, Bau dir eine allgemeines Darstellungspanel, abstrahiere Dein Fachliches Problem so, dass Du diese grafische Darstellung auch für andere Fachlichkeiten verwenden könntest. Das erspart falls Du später mal eine ähnliche Aufgabe haben solltest ein Haufen Arbeit, da du nur noch das ganze anwenden aber nicht erneut programieren musst.
Tips dazu:
Kapsele die darzustellenden Werte in fachlich neutralere Informationseinheiten, bzw erschaffe 'Interfaces' (nicht implementiere Abstrakte Klassen), die von Deinem Grafikpanel entsprechend enterpretiert werden können. und überge diese dem Panal als wie auch immer geartete Collection (z.B. verkettete Liste)
konkretere Tips gebe ich gerne auf Anfrage

Takidoso
 

Neue Beiträge

Zurück