Page 5 of 7 FirstFirst ... 3 4 5 6 7 LastLast
Results 61 to 75 of 102

Thread: Zon opkomst- Ondergangs tijden berekenen

  1. #61
    Moet die Datum_12u 12:00 's-middags zijn of 00:00 's-nachts???

    Als de DateTimePicker1 overigens in het fractioneel gedeelte de tijd teruggeeft moet je ook niet zomaar 0.5 erbij optellen. Want dan wordt 10:30 bijvoorbeeld 22:30. En 07:30 wordt 19:30 etc. Blijft nog dezelfde dag totdat je het 's-middags gaat uitvoeren. 15:00 wordt 03:00 de volgende dag/nacht.

    Je moet dus eerst de datum op een hele datum zetten (0:00) met trunc en dan 0.5 erbij tellen (indien je inderdaad 's-middags wilt hebben).

    Datum_12u := trunc(DateEdit1.DateTime) + 0.5;
    (Nu weet je zeker dat je precies het middaguur hebt.)

  2. #62
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Volgens de Wiki is er maar één 12:00 pm

    https://nl.wikipedia.org/wiki/Ante_m..._post_meridiem
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #63
    Ik gebruik regelmatig deze code (zie post 30-Jan-05, 21:25), maar zou daar nu ook graag de Altitude (Zon hoogte) en de Azimuth (Zon positie) in willen hebben.

    https://nl.wikipedia.org/wiki/Azimut

    Maar hoe verwerk ik deze in de bestaande code ?
    Last edited by MMSoft; 17-May-23 at 08:30.

  4. #64
    Die functies staan toch in die code?
    BerekenAzi en BerekenHoogte.

    (overigens niet handig op een post van 18 jaar geleden te reageren en dan niet even de post waarnaar je verwijst te quoten.)

    Delphi Code:
    1. function BerekenAzi(const H, Lat, decl: double): Double;
    2. // Berekening van de azimuth (peiling van de zon.)
    3.  
    4. function BerekenHoogte(const H, Lat, decl: double): Double;
    5. // Berekening van de hoogte van de zon.

  5. #65
    Ik had eerst de post gequoot, maar dan was de zip niet te zien (en daar ging het om).

    Ik krijg er helaas geen bruikbare waardes uit, dit heb ik nu:

    Lat := 52.36993;
    Lon := 4.90788;

    MA := BerekenMA( Now );
    C := Excentriciteit(MA);
    Lambda := BerekenLambda(MA, C);
    decl := BerekenDecl(Lambda);
    H := BerekenUurhoek(0, decl, Lat);

    Test_1 := BerekenAzi(H, Lat, decl);
    Test_2 := BerekenHoogte(H, Lat, decl);

    En krijg deze waardes
    Test_1: -55.886.... (moet zijn 283.62)
    Test_2: -0.8299.... (moet zijn 14.13)

    Wat doe ik verkeerd ?

  6. #66
    Geen idee. Ik ben niet de maker van die functie.
    Ik dacht alleen aan de naam dat ie wel zit werken.

  7. #67
    Ik heb werkende Python code omgezet en heb nu de 2 hoeken die ik nodig heb, maar ben nog steeds benieuwd hoe ik
    "BerekenAzi" en "BerekenHoogte" werkend kan krijgen...

  8. #68
    Het is inderdaad wel handig om de relevante code erbij te zoeken in plaats van mensen zelf te laten zoeken naar een functie in een library in een zipje in een thread van 5 pagina's en 2 decennia lang. Een linkje naar de post is wel het minste (het post nummer is een link die je kan kopiëren!), maar de functie in je nieuwe post plakken is natuurlijk ook een kleine moeite.

    Maar ik zou eerst de betreffende functie nog eens naast het origineel houden of naast andere voorbeelden houden. Je bent tenslotte 18 jaar verder, dus wellicht heb je wat nieuwe inzichten over wat er niet goed aan is, of ben je inmiddels wat beter in debuggen.
    Last edited by GolezTrol; 20-May-23 at 02:37.
    1+1=b

  9. #69
    Quote Originally Posted by MMSoft View Post
    Ik had eerst de post gequoot, maar dan was de zip niet te zien (en daar ging het om).
    De functie zijn nog precies gelijk, ik had deze 2 alleen nog niet gebruikt

    Maar bij deze:
    Quote Originally Posted by Matthijs View Post
    Op basis van deze pagina heb ik een en ander in elkaar gezet. Als je het genoemde verhaal er naast legt zul je een heel eind komen. Volgens mij zijn de tijden redelijk accuraat. Volgens de maker van de pagina kunnen ze zelfs de vergelijking met de planetariumprogramma's Redshift 3 en Redshift 5 doorstaan. (Wat dat dan ook moge zijn. )

  10. #70
    De functies BerekenAzi en BerekenHoogte hebben als inputvariabele de Uurhoek, dat is de hoek tussen de Rechte Klimming van het hemellichaam en die van de Meridiaan: https://en.wikipedia.org/wiki/Hour_angle

    Delphi Code:
    1. H := BerekenUurhoek(0, decl, Lat)
    draagt dus die waarde van de Uurhoek (ongelukkige naamgeving want makkelijk te verwarren met Hoogte H, maar dit terzijde) en wordt zowel voor opkomst als ondergang berekend met de inputvariabele
    Delphi Code:
    1. const h = 0
    (immers zonhoogte boven/onder de horizon = 0; opkomst en ondergang)
    of
    Delphi Code:
    1. const h = -6
    (zon 6 graden onder horizon; einde schemering)

    Dat verklaart dat je niet krijgt wat je verwacht: azimuth en hoogte van een hemellichaam op een bepaald tijdstip.
    (wat je met F8, wandelend door de code, al duidelijk had moeten worden ;-))
    Daarvoor is berekening van de Lokale Sterretijd (LST) nodig op plaats en tijd van waarneming.
    Dan dienen de functies over te gaan in:
    Delphi Code:
    1. BerekenAzi(LST, Lat, Decl)
    2. BerekenHoogte(LST, Lat, Decl)


    Ik kan je die functies via DM wel aanreiken als het je na al die jaren zelf nog niet gelukt is...
    Want laten we eerlijk zijn: dit was 18 jaar geleden al geen Delphi-issue en nu nog steeds niet...

  11. #71
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Code:
    function Sunrise(dt: TDateTime; lon, lat: double): TDateTime;
    var
      d, n: double;
    begin
      d := dt - 2451545.0 - lon / 360.0;
      n := 0.0009 + 0.00306 * cos(d * pi / 180) - 0.00038 * cos(2 * d * pi / 180) + 0.00035 * cos(3 * d * pi / 180);
      Result := dt + n - lon / 360.0 - 2451545.0;
    end;
    
    function Sunset(dt: TDateTime; lon, lat: double): TDateTime;
    var
      d, n: double;
    begin
      d := dt - 2451545.0 - lon / 360.0;
      n := 0.0009 + 0.00306 * cos(d * pi / 180) - 0.00038 * cos(2 * d * pi / 180) + 0.00035 * cos(3 * d * pi / 180);
      Result := dt + n - lon / 360.0 - 2451545.0 +1;
    end;
    Deze functies zijn gebaseerd op de formule van Jean Meeus en zijn afkomstig uit de Lazarus wiki.

    Met dank aan chatGPT, die ook netjes de bron noemde en door mij geverifieerd....
    Last edited by Thaddy; 30-Jun-23 at 10:30. Reason: chatGPT
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  12. #72
    Hier is een functie voor de ZonHoogte.
    Deze berekening klopt aardig met https://www.suncalc.org

    Pascal Code:
    1. function ZonHoogte(dt: tdatetime; latitude, longitude: double): double;
    2. var
    3.   dag, uur: double;
    4.   latrad, g: double;
    5.   d, t: double;
    6.   sha, sza, saa: double;
    7. begin
    8.   dt := LocalTimeToUniversal(dt);
    9.   dag := DayOfTheYear(dt);
    10.   uur := frac(dt);
    11.   latrad := degtorad(latitude);
    12.   g := (2 * pi / 365.25) * (dag + uur);
    13.   d := Math.degtorad(0.396372 - 22.91327 * cos(g) + 4.02543 * sin(g)
    14.     - 0.387205 * cos(2 * g) + 0.051967 * sin(2 * g)
    15.     - 0.154527 * cos(3 * g) + 0.084798 * sin(3 * g));
    16.   t := Math.degtorad(0.004297 + 0.107029 * cos(g) - 1.837877 * sin(g)
    17.     - 0.837378 * cos(2 * g) - 2.340475 * sin(2 * g));
    18.   sha := 2 * pi * (uur - 0.5) + t + Math.degtorad(longitude);
    19.   sza := arccos(sin(latrad) * sin(d) + cos(latrad) * cos(d) * cos(sha));
    20.   saa := arccos((sin(d) - sin(latrad) * cos(sza)) / (cos(latrad) * sin(sza)));
    21.   Result := 90 - Math.radtodeg(sza);
    22. end;

    Lijkt er dus op dat de degtorad er na de berekening overheen gaat.
    Dat zou betekenen dat deze niet goed zou zijn.

    (Er zijn echter heel wat verschillende berekeningen te vinden)

    PS als je ook de positie wilt hebben moet je die even uit saa pakken (met radtodeg en omswap van 360 graden zoals in je eigen code.
    Last edited by rvk; 19-Jul-23 at 12:42.

  13. #73
    De Dag_vh_Jaar werkt, maar met het berekenen van het Uur loop ik vast, dus hoe kan ik dat het beste doen ?

    Zon_Hoogte := ZonHoogte(2023, 7, 20, 19, 40, 52.1009186, 5.6462783);

    Deze zou 0.819444444445253 moeten zijn denk ik.
    Last edited by MMSoft; 21-Jul-23 at 11:43.

  14. #74
    Quote Originally Posted by MMSoft View Post
    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:
    1. function ZonHoogte(aJaar, aMaand, aDag, aUur, aMin: Integer; latitude, longitude: double): double;
    2. var
    3.   dag, uur: double;
    4.   latrad, g: double;
    5.   d, t: double;
    6.   sha, sza, saa: double;
    7. begin
    8.   // dt := LocalTimeToUniversal(dt);
    9.   dt := EncodeDateTime(aJaar, aMaand, aDag, aUur, aMin, 0, 0); // Alleen dit was dus nodig !!
    10.   dag := DayOfTheYear(dt);
    11.   uur := frac(dt);
    12.   latrad := degtorad(latitude);
    13.   g := (2 * pi / 365.25) * (dag + uur);
    14.   d := Math.degtorad(0.396372 - 22.91327 * cos(g) + 4.02543 * sin(g)
    15.     - 0.387205 * cos(2 * g) + 0.051967 * sin(2 * g)
    16.     - 0.154527 * cos(3 * g) + 0.084798 * sin(3 * g));
    17.   t := Math.degtorad(0.004297 + 0.107029 * cos(g) - 1.837877 * sin(g)
    18.     - 0.837378 * cos(2 * g) - 2.340475 * sin(2 * g));
    19.   sha := 2 * pi * (uur - 0.5) + t + Math.degtorad(longitude);
    20.   sza := arccos(sin(latrad) * sin(d) + cos(latrad) * cos(d) * cos(sha));
    21.   saa := arccos((sin(d) - sin(latrad) * cos(sza)) / (cos(latrad) * sin(sza)));
    22.   Result := 90 - Math.radtodeg(sza);
    23. end;

  15. #75
    Omdat ik hierna deze code om wil zitten naar 'C' t.b.v. een Microcontroller (https://www.circuitsonline.net/forum/view/162033)

    wil ik zo min mogelijk Delphi routines gebruiken, ik heb het nu zo, klopt dit denken jullie ?
    Zie ook de 4e regel van onder.
    Code:
    //------------------------------------------------------------------------------
    
    function ZonHoogte(aJaar, aMaand, aDag, aUur, aMin: Integer; latitude, longitude: double): double;
    var
      latrad, g: double;
      d, t: double;
      sha, sza, saa: double;
      Datum_Str: String;
      Dag_vh_Jaar: Integer;
      Uur_Minuten: Double;
      Deel_vd_Dag: double;
    
    begin
      Datum_Str := IntToStr(aDag) + '-' + IntToStr(aMaand) + '-' + IntToStr(aJaar);
      Dag_vh_Jaar := DayOfTheYear( StrToDate( Datum_Str) ); //Dag van het Jaar
    
      Uur_Minuten := aUur + (aMin/60);
      Deel_vd_Dag := Uur_Minuten / 24; //Deel vd Dag
    
      latrad := degtorad(latitude);
      g := (2 * pi / 365.25) * (Dag_vh_Jaar + Deel_vd_Dag);
    
      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 * (Deel_vd_Dag - 0.5) + t + Math.degtorad(longitude); //uur is nu Deel_vd_Dag (Is dat goed ?)
      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;
    
    //------------------------------------------------------------------------------

Page 5 of 7 FirstFirst ... 3 4 5 6 7 LastLast

Thread Information

Users Browsing this Thread

There are currently 2 users browsing this thread. (0 members and 2 guests)

Similar Threads

  1. Replies: 16
    Last Post: 17-Jun-04, 16:46

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •