Originally Posted by
MMSoft
De Dag_vh_Jaar werkt, maar met het berekenen van het Uur loop ik vast, dus hoe kan ik dat het beste doen ?
dt was een TDateTime. En dat is altijd het datumgedeelte als hele gedeelte en de tijd van de dag in het fractionele gedeelte.
4,75 is dan ook de 4e dag na 1 jan 1970 en 0,75 van de dag (wat dus 21:00 is).
Je wilt dus die 21 (uur) delen door 24 om op een gedeelte van de dag te komen (om bij "uur" te gebruiken).
Wel ook nog de minuten (als deel van een uur) erbij doen, dus ( 21 + (15 min /60) ) / 24.
Dus uur_in_proc := Uur + ((Min/60)) / 24
(wel even handig om die uur variabele te hernoemen want nu heb je er twee)
PS. Je doet nu eerst de integers omzetten naar een string en dan de string naar DayOfYear( TDateTime ).
Dat is niet zo handig. Je kunt beter System.SysUtils.EncodeDate gebruiken:
https://docwiki.embarcadero.com/Libr...ils.EncodeDate
Code:
Dag_vh_Jaar_Int := DayOfTheYear( EncodeDate(Jaar, Maand, Dag) );
Dan heb je geen datumstring tussenstap nodig.
Dat gezegd hebbende... Je had sowieso de hele Jaar Maand Dag Uur Min om kunnen zetten naar een TDateTime.
Dan was je gelijk klaar geweest
https://docwiki.embarcadero.com/Libr...EncodeDateTime
Dus in mijn routine:
Delphi Code:
function ZonHoogte(aJaar, aMaand, aDag, aUur, aMin: Integer; latitude, longitude: double): double;
var
dag, uur: double;
latrad, g: double;
d, t: double;
sha, sza, saa: double;
begin
// dt := LocalTimeToUniversal(dt);
dt := EncodeDateTime(aJaar, aMaand, aDag, aUur, aMin, 0, 0); // Alleen dit was dus nodig !!
dag := DayOfTheYear(dt);
uur := frac(dt);
latrad := degtorad(latitude);
g := (2 * pi / 365.25) * (dag + uur);
d := Math.degtorad(0.396372 - 22.91327 * cos(g) + 4.02543 * sin(g)
- 0.387205 * cos(2 * g) + 0.051967 * sin(2 * g)
- 0.154527 * cos(3 * g) + 0.084798 * sin(3 * g));
t := Math.degtorad(0.004297 + 0.107029 * cos(g) - 1.837877 * sin(g)
- 0.837378 * cos(2 * g) - 2.340475 * sin(2 * g));
sha := 2 * pi * (uur - 0.5) + t + Math.degtorad(longitude);
sza := arccos(sin(latrad) * sin(d) + cos(latrad) * cos(d) * cos(sha));
saa := arccos((sin(d) - sin(latrad) * cos(sza)) / (cos(latrad) * sin(sza)));
Result := 90 - Math.radtodeg(sza);
end;
Bookmarks