// Formeln aus dem Javascript der digitalen Sonnenuhr // in www.nicko-online.de und www.mein-skerbersdorf.de // Autor: Erich Stadler // nach Formeln und Tabellen aus // Arnold Zenkert: Faszination Sonnenuhr, // Verlag Harri Deutsch 1995, ISBN 3-8171-1386-2 // d,m =aktuelles Datum (3.Mai => d=3, m=5) // lambda=geogr. Länge im Bogenmaß // phi=gegr. Breite im Bogenmaß // delta=Deklination der Sonne im Bogenmaß // tau=Stundenwinkel der Sonne im Bogenmaß // z=Zeitgleichung in Zeit-Minuten //-------------------------------------------------- // Berechnung der Deklination für den d.Tag des Monats m eines Jahres // Ergebnis in Grad; => delta=Ergebnis*(Pi/180) // Zenkert, Tabelle ab S. 155 //-------------------------------------------------- function Deklination (d,m) { var dekl=new Array( // Deklination für den // 1. 6. 11. 16. 21. 26. des Monats -23.1, -22.6, -21.9, -21.0, -20.0, -18.8, -17.3, -15.8, -14.2, -12.5, -10.8, -8.9, -7.8, -5.9, -3.9, -2.0, 0.0, 2.0, 4.3, 6.3, 8.1, 9.9, 11.7, 13.3, 14.9, 16.4, 17.7, 19.0, 20.1, 21.0, 22.0, 22.6, 23.1, 23.3, 23.4, 23.4, 23.2, 22.8, 22.2, 21.5, 20.6, 19.1, 18.2, 16.9, 15.4, 13.9, 12.3, 10.6, 8.2, 6.7, 4.8, 2.9, 0.9, -1.0, -3.0, -4.9, -6.8, -8.7, -10.5, -12.3, -14.3, -15.8, -17.3, -18.6, -19.8, -20.8, -21.7, -22.4, -23.0, -23.3, -23.4, -23.4, -23.1 ); var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt. // var k=(d-1 - 5*Math.floor((d-1)/5))/5; return(dekl[i]+k*(dekl[i+1]-dekl[i])); } //-------------------------------------------------- // Berechnung der Zeitgleichung für den d.Tag des Monats m eines Jahres // in Minuten (Das ist der Wert, um den jede Sonnenuhr wegen der elliptischen Erdbahn // falsch geht (hängt von der Jahreszeit ab) // Zenkert, Tabelle ab S. 155 //-------------------------------------------------- function Zeitgleichung (d,m) { var zgz=new Array( // Zeitgleichung für den // 1. 6. 11. 16. 21. 26. des Monats -3.5, -5.8, -7.9, -9.7, -11.3, -12.6, //Januar -13.6, -14.1, -14.3, -14.1, -13.7, -13.0, -12.4, -11.4, -10.1, -8.7, -7.3, -5.8, -4.0, -2.5, -1.1, 0.2, 1.3, 2.2, 2.9, 3.4, 3.7, 3.7, 3.5, 3.1, 2.3, 1.5, 0.5, -0.6, -1.6, -2.9, -3.7, -4.6, -5.4, -6.0, -6.3, -6.5, -6.3, -5.9, -5.2, -4.3, -3.2, -1.9, -0.2, 1.6, 3.3, 5.1, 6.9, 8.6, 10.3, 11.7, 13.2, 14.4, 15.3, 16.0, 16.4, 16.4, 16.0, 15.3, 14.2, 12.8, 11.0, 9.1, 6.9, 4.5, 2.0, -0.5, //Dezember -3.5 ); var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt. // var k=(d-1 - 5*Math.floor((d-1)/5))/5; return(zgz[i]+k*(zgz[i+1]-zgz[i])); } //-------------------------------------------------- // Berechnet aus aktueller Uhrzeit, geogr. Länge lambda (0..tau..2*PI) // und Zeitgleichung z den Stundenwinkel // getUTCHours,getUTCMinutes,getUTCSeconds=Aktuelle Greenwich-Zeit (UTC) // An einem Tage ändert sich der Stundenwinkel von 0h bis 24h Greenwich-Zeit // dort gleichmäßig von -Pi über 0 (12h) bis +Pi // Bei uns geht die Sonne pro Längengrad um 4 Minuten früher auf => +4*b2g(lambda) // (b2g: Umrechnung von lambda aus dem Bogenmaß ins Gradmaß) // Dazu kommt noch die jahreszeitlich veränderliche Zeitgleichung //-------------------------------------------------- function Date2Stundenwinkel (d,lambda,z) { var tau= Math.PI/(12*60*60) // 12 Zeit-Stunden entsprechen Pi=180 Grad *( 60*60*d.getUTCHours() // Greenwich-Zeit (für lamda=0) +60*( d.getUTCMinutes() +4*b2g(lambda) // 1 Grad entspricht 4 Zeitminuten +z // Zeitgleichung in Minuten ) +d.getUTCSeconds() ) -Math.PI; // 12 Uhr entspricht 0 Grad if (tau<0){tau=tau+2.0*Math.PI} return(tau); } //-------------------------------------------------- // Berechnung des Sonnen-Azimuts (im Bogenmaß) aus geogr. Breite phi, // Deklination delta und Stundenwinkel tau // Zenkert S. 67 //-------------------------------------------------- function Azimut (phi, delta, tau){ var k; with (Math) { if (cos(tau)>=(tan(delta)/tan(phi))){k=0} else {k=1.0}; var r=k*PI+atan(sin(tau)/(sin(phi)*cos(tau)-cos(phi)*tan(delta))); if (r>PI){r=r-2.0*PI}; return(r); } } //-------------------------------------------------- // Berechnung der Sonnen-Höhe (im Bogenmaß) aus geogr. Breite phi, // Deklination delta und Stundenwinkel tau // Zenkert S. 67 //-------------------------------------------------- function Hoehe (phi, delta, tau){ with (Math) { return(asin(sin(phi)*sin(delta)+cos(phi)*cos(delta)*cos(tau))) } } //-------------------------------------------------- <