Autor Beitrag
muschelschubser
Hält's aus hier
Beiträge: 11

Win 2000, Win XP
D7 Prof
BeitragVerfasst: Mi 30.11.05 17:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11

Win 2000, Win XP
D7 Prof
BeitragVerfasst: 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 ;-):

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54

Win 2000, Win XP, Win 2003, Linux
Delphi 2006 Prof.
BeitragVerfasst: Sa 03.12.05 01:23 
Falls du die Unit Math benutzen möchtest geht's auch so:
ausblenden 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;