Phases de la lune.

Voir le sujet précédent Voir le sujet suivant Aller en bas

Phases de la lune.

Message par Olivier le Lun 3 Nov - 21:40

On me demande souvent mon script de phases de la lune.
très léger et souvent suffisant, une facilitation, un trucage même qui laisse à penser que la lune est un astre dont la course est cylindrique....
Code:
<?php
$mps=2551442.8; // 29jrs 12 heures 44 minutes 2.8 secondes = revolution moyenne.
$position=time()-mktime(13, 57, 0, 1, 3, 2007); // secondes passées depuis la référence (1/3/2007 a 13h57)
$position=($position-$mps*intval($position/$mps))/$mps;
$position = $position +.5;
if ($position>1){$position--;}
$position=round(29.530587*$position,0);
echo "<img src='moon$position.gif' alt = ''>";
?>

Beaucoup plus précis, mais plus lourd...
Une adaptation d'un script en Perl d'un certain Hamilton:
Code:
<?
/*
Adaptation en php du script Astro-MoonPhase de Brett Hamilton.
*/
class Moon
    {
    function phase($Year, $Month, $Day, $Hour, $Minutes, $Seconds)
        {
        $DateSec = mktime($Hour, $Minutes, $Seconds, $Month, $Day, $Year, 0);
        ini_set(precision, "20");    //Defini la precision des calculs
        $Epoch                    = 2444238.5;        // 0 janvier 1980
        # Soleil
        $Elonge                    = 278.833540;        # ecliptic longitude of the Sun at epoch 1980.0
        $Elongp                    = 282.596403;        # ecliptic longitude of the Sun at perigee
        $Eccent                    = 0.016718;            # eccentricity of Earth's orbit
        $Sunsmax                = 1.495985e8;        # semi-major axis of Earth's orbit, km
        $Sunangsiz                = 0.533128;            # sun's angular size, degrees, at semi-major axis distance
        # Lune, epoch 1980.0.
        $Mmlong                    = 64.975464;        # moon's mean longitude at the epoch
        $Mmlongp                = 349.383063;        # mean longitude of the perigee at the epoch
        $Mlnode                    = 151.950429;        # mean longitude of the node at the epoch
        $Minc                    = 5.145396;            # inclination of the Moon's orbit
        $Mecc                    = 0.054900;            # eccentricity of the Moon's orbit
        $Mangsiz                = 0.5181;            # moon's angular size at distance a from Earth
        $Msmax                    = 384401.0;            # semi-major axis of Moon's orbit in km
        $Mparallax                = 0.9507;            # parallax at distance a from Earth
        $Synmonth                = 29.53058868;        # synodic month (new Moon to new Moon)
        $pdate = Moon::jtime($DateSec);
        $pphase;                # illuminated fraction
        $mage;                    # age of moon in days
        $dist;                    # distance in kilometres
        $angdia;                # angular diameter in degrees
        $sudist;                # distance to Sun
        $suangdia;                # sun's angular diameter
        # Calcul position soleil.
        $Day = $pdate - $Epoch;                                     
        $N = Moon::fixangle((360 / 365.2422) * $Day);                # ano moyenne soleil
        $M = Moon::fixangle($N + $Elonge - $Elongp);               
        $Ec = Moon::kepler($M, $Eccent);                            # equation de Kepler
        $Ec = sqrt((1 + $Eccent) / (1 - $Eccent)) * tan($Ec / 2);
        $Ec = 2 * Moon::todeg(atan($Ec));                            # anomalie vraie
        $Lambdasun = Moon::fixangle($Ec + $Elongp);                    # ecliptique geocentrique du soleil
        $F = ((1 + $Eccent * cos(Moon::torad($Ec))) / (1 - $Eccent * $Eccent));
        $SunDist = $Sunsmax / $F;                                    # distance au soleil en km
        $SunAng = $F * $Sunangsiz;                                    # diametre du soleil en degrés
        # Calcul position lune.

        # longitude moyenne.
        $ml = Moon::fixangle(13.1763966 * $Day + $Mmlong);
        # Anomalie moyenne
        $MM = Moon::fixangle($ml - 0.1114041 * $Day - $Mmlongp);
        # Noeud ascendant
        $MN = Moon::fixangle($Mlnode - 0.0529539 * $Day);
        $Ev = 1.2739 * sin(Moon::torad(2 * ($ml - $Lambdasun) - $MM));
        # Equation annuelle.
        $Ae = 0.1858 * sin(Moon::torad($M));
        # terme de correction
        $A3 = 0.37 * sin(Moon::torad($M));
        # Anomalie corrigée
        $MmP = $MM + $Ev - $Ae - $A3;
        # Correction de l'equation du centre.
        $mEc = 6.2886 * sin(Moon::torad($MmP));
        # terme de correction
        $A4 = 0.214 * sin(Moon::torad(2 * $MmP));
        # Longitude corrigée.
        $lP = $ml + $Ev + $mEc - $Ae + $A4;
        # Variation.
        $V = 0.6583 * sin(Moon::torad(2 * ($lP - $Lambdasun)));
        # Longitude vraie.
        $lPP = $lP + $V;
        # Longitude corrigée des noeuds.
        $NP = $MN - 0.16 * sin(Moon::torad($M));
        $y = sin(Moon::torad($lPP - $NP)) * cos(Moon::torad($Minc));
        $x = cos(Moon::torad($lPP - $NP));
        # Longitude de l'ecliptique.
        $Lambdamoon = Moon::todeg(atan2($y, $x));
        $Lambdamoon += $NP;
        # Latitude de l'ecliptique.
        $BetaM = Moon::todeg(asin(sin(Moon::torad($lPP - $NP)) * sin(Moon::torad($Minc))));
        # Calcul des phases de lune.
        # Age de la lune en degrés
        $MoonAge = $lPP - $Lambdasun;
        # Phase.
        $MoonPhase = (1 - cos(Moon::torad($MoonAge))) / 2;
        # Calcul distance lune <-> centre terre
        $MoonDist = ($Msmax * (1 - $Mecc * $Mecc)) /
            (1 + $Mecc * cos(Moon::torad($MmP + $mEc)));
        # Calcul diametre lune en degres
        $MoonDFrac = $MoonDist / $Msmax;
        $MoonAng = $Mangsiz / $MoonDFrac;
        # Calcul parallaxe.
        $MoonPar = $Mparallax / $MoonDFrac;
        $pphase = $MoonPhase;                                    # illuminated fraction
        $mage = $Synmonth * (Moon::fixangle($MoonAge) / 360.0);    # age of moon in days
        $dist = $MoonDist;                                        # distance in kilometres
        $angdia = $MoonAng;                                        # angular diameter in degrees
        $sudist = $SunDist;                                        # distance to Sun
        $suangdia = $SunAng;                                    # sun's angular diameter
        $mpfrac = Moon::fixangle($MoonAge) / 360.0;
        return array( $pphase, $mage, $dist, $angdia, $sudist, $suangdia, $mpfrac, $mpfrac );
        }

    function fixangle($x)    { return ($x - 360.0 * (floor($x / 360.0))); }    # fix angle
    function torad($x)    { return ($x * (M_PI / 180.0)); }                # deg->rad
    function todeg($x)    { return ($x * (180.0 / M_PI)); }                # rad->deg

    function jtime($t)
        {
        $julian = ($t / 86400) + 2440587.5;    # (seconds /(seconds per day)) + julian date of epoch        2440587.5 / 86400 = 28,24753472222 Days
        return ($julian);
        }

    function kepler($m, $ecc)
        {
        $EPSILON = 1e-6;

        $m = Moon::torad($m);
        $e = $m;
        while (abs($delta) > $EPSILON)
            {
            $delta = $e - $ecc * sin($e) - $m;
            $e -= $delta / (1 - $ecc * cos($e));
            }
        return ($e);
        }

    }
   
   
//Exemple d'utilisation :

if ($mois == "") {$mois = date("n");}
if ($jour == "") {$jour =date("d");}
if ($an == "") {$an =date("Y");}
if ($hr == "") {$hr =date("H");}
if ($mn == "") {$mn =date("i");}
if ($se == "") {$se =date("s");}

list($MoonPhase, $MoonAge, $MoonDist, $MoonAng, $SunDist, $SunAng, $mpfrac) = Moon::phase($an, $mois, $jour, $hr, $mn, $se);
echo "Pour le: ". $jour ." " . $mois." ".$an. " à " . $hr .":" . $mn.":".$se."<br>";
echo "La Lune est éclairée à ".number_format($MoonPhase*100, 2, ',', '')."%"."<br>";
echo "Son age est de ".number_format($MoonAge, 8, ',', '')." jours"."<br>";
echo "Et elle se situe à une distance de ".number_format($MoonDist, 0, ',', '')." km par rapport à la Terre."."<br>";

$position=round($MoonAge,0);
// là ca marchera si vous avez les vues
echo "<img src=\"/lune/moon$position.gif\" width=\"50\" height=\"50\" alt = \"\">";

?>

Si elles vous plaisent je peux vous passer mes vues, avec ces scripts

Olivier
Admin
Admin

Nombre de messages : 1124
Date d'inscription : 16/02/2006

Voir le profil de l'utilisateur http://olravet.fr

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum