Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Schnitt von zwei Intervallen berechnen?
muschelschubser - Mi 30.11.05 17:54
Titel: Schnitt von zwei Intervallen berechnen?
Hallo Leute,
Entschuligung im voraus, wenn ich mich zu blöde im benutzen der Suchenfunktion angestellt habe. Ausserdem wusste ich nicht genau welches Forum nun das richtige ist, meinetwegen ruhig verschieben (@Mod gemeint :) )
Ich muss / will den Schnitt (die Länge) von zwei Intervallen berechnen (In diesem Falle wirklich Zeiträume), deren Anfangs- und Endzeitpunkte ich kenne. Nun war ich auf der Suche nach einer Unit / Funktion / Methode in Delphi, die mir das fertig zaubert, gibts eine?
DateUtils gibt nichts her, soweit ich das beurteilen kann.
Wenn nicht, dann mach ich mich daran die selber zu zaubern ;-)
Danke im voraus,
schubser
GTA-Place - Mi 30.11.05 19:22
Wieso denn eine Unit? Zieh End-Zeit von Start-Zeit ab bei beiden Zeiten, addiere beide Werte und teile sie durch 2.
Horst_H - Do 01.12.05 09:44
Hallo,
ich glaube es ist etwas anderes , als die mittlere Zeitdauer gemeint.
Sei Zeitraum1 durch ZeitBeginn1 und ZeitEnde1 beschrieben und analog Zeitraum2.
Ausserdem sei ZeitBeginn1<=Zeitbeginn2.
Dann ist das Intervall, indem sich Zeitraum1 und und Zeitraum2 überschneiden
einfach
ZeitIntervall = ZeitBeginn2-ZeitEnde1
Falls das kleiner 0 ist, gibt es keine Überschneidung.
Falls aber zusätzlich ZeitEnde1> ZeitEnde2 dann ist der ZeitIntervall = ZeitEnde2-ZeitBeginn2, also ist Zeitraum2 vollstaendig in Zeitraum1.
Falls es mehrere Intervalle zu überprüfen gilt, sind IntervallGraphen nützlich.
Gruss Horst
muschelschubser - Do 01.12.05 11:34
Titel: Erläuterung und Ende
Hallo, Danke euch beiden!
@GTA: Horst_H hat recht, es ist etwas anderes gemeint.
@Horst_H:
Es gilt lediglich 2 Intervalle zu betrachten (zum Glück), allerdings kann deren Anordnung völlig frei sein, ich versuch mal ASCII Art ;-):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Intevall I:
i1 |----------------------------| i2
m1 |------| m2 n1 |-----| n2
o1 |---..............................---| o2
p1 |.....| p2
q1 |------.....| q2 r1 |....----| r2
^^^^^^ mögliche intervall positionen des zweiten Intervalls (M,N,P,Q,R) ^^^^^^^^ |
Der gepunktete Bereich ist der Schnitt der Intervalle und die Länge davon möchte ich haben.
Ich habe mir mittlerweile eine funktion gezaubert, die das macht, wichtig ist dabei die Reihenfolge der Überprüfung, sonst gibts Probleme ;-)
hier die Funktion, für alle interessierten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function GetIntersectPeriod(StartOfVoyage, IntervalStartDate, EndOfVoyage, IntervalEndDate: TDateTime) : Double; begin Result := 0; if (EndOfVoyage < IntervalStartDate) and (StartOfVoyage > IntervalEndDate) then Exit
else if (StartOfVoyage < IntervalStartDate) and (IntervalEndDate < EndOfVoyage) then Result := DaySpan(IntervalEndDate, IntervalStartDate)
else if (IntervalStartDate < StartOfVoyage) and (EndOfVoyage < IntervalEndDate) then Result := DaySpan(EndOfVoyage, StartOfVoyage)
else if (StartOfVoyage < IntervalStartDate) and (EndOfVoyage < IntervalEndDate) then Result := DaySpan(EndOfVoyage, IntervalStartDate)
else if (StartOfVoyage < IntervalEndDate) and (IntervalEndDate < EndOfVoyage) then Result := DaySpan(IntervalEndDate, StartOfVoyage);
end; |
Kann sein das da noch ein Denkfehler drin ist, aber das Prinzip sollte klar geworden sein.
Danke an alle und einen schönen, ruhigen und erfolgreichen Tag!
gruß,
schubser
delfiphan - Fr 02.12.05 21:18
Vielleicht hilft das:
n Intervalle miteinander schneiden
- Anfangs/Endpunkte aller Intervalle in eine Liste schreiben
- Alle Punkte sortieren
- Counter = 0 setzen
- Die Punkte von links nach rechts traversieren:
-> falls Anfangspunkt: Counter inkrementieren
-> falls Endpunkt: Counter dekrementieren
Der Counter gibt nun immer an, wieviele Intervalle sich zu einem Zeitpunkt schneiden. Ist Counter = n, dann ist man in einem Gebiet wo sich alle Intervalle schneiden.
Flocke - Sa 03.12.05 01:23
Falls du die Unit Math benutzen möchtest geht's auch so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| function GetIntersectPeriod(StartOfVoyage, IntervalStartDate, EndOfVoyage, IntervalEndDate: TDateTime) : Double; begin Result := Max(Min(IntervalEndDate, EndOfVoyage) - Max(IntervalStartDate, StartOfVoyage), 0.0); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!