Aller au contenu

Script PHP pour calculer la phase de la lune :)


astro-fr.net

Messages recommandés

Salut, comme promis, voici le code PHP pour calculer et afficher la phase de la Lune sous forme de petite image.

 

Vous pouvez voir ce que ça donne ici :) Et télécharger le script .

 

J'espère qu'il n'y a pas trop de bugs ... en tout cas ça marche chez moi :D

Bon code à toutes et à tous :)

 


<?php

define("SYNODIC", 29.53058867); //constante pour la période synodique

define("MSPARJOUR", 24 * 60 * 60 * 1000); //constante pour le nombre de millisecondes par jour



function CalcPhase() {

 $DateRef = mktime(8,53,0,7,29,2003); //date de référence : le 29/07/2003 à 6:53:00 GMT il y a eu une pleine lune

 $Aujourdui = mktime(); //date du jour

 $msDiff = ($Aujourdui - $DateRef)*1000 + MSPARJOUR; //on calcule la différence en millisecondes

 $phase = ($msDiff * 100)/(SYNODIC * MSPARJOUR); //on calcule le pourcentage de la phase

 while($phase>100) // tant que c'est supérieur à 100, on retire 100

  {

  $phase -= 100;

  }

 return $phase;

}



function ImgPhase($phase) {

 $NumImage = round(29 * $phase / 100, 0); // on convertit le pourcentage en age de la lune (sur 29 jours)

 if($NumImage==0) $NumImage==1;

 $ImagePhase = 'day'.$NumImage.'.GIF';

 return $ImagePhase;

}



function PartEntier($phase) {

 if ( $phase <= 50.0 )

 {

 $plein = $phase * 2;

 }

 else

 {

 $plein = ( 100 - $phase ) * 2;

 }

 return $plein;

}



function NommerPhase($phase)

//convertit le pourcentage de lunaison en mots

{

if($phase >= 0 && $phase <= 2.49)

 {

 $NomPhase = "Nouvelle Lune";

 }

else if($phase >= 2.5 && $phase <= 22.49)

 {

 $NomPhase = "Premier Croissant";

 }

else if($phase >= 22.5 && $phase <= 27.49)

 {

 $NomPhase = "Premier Quartier";

 }

else if($phase >= 27.5 && $phase <= 47.49)

 {

 $NomPhase = "Lune gibbeuse";

 }

else if($phase >= 47.5 && $phase <= 52.49)

 {

 $NomPhase = "Pleine Lune";

 }

else if($phase >= 52.5 && $phase <= 73.49)

 {

 $NomPhase = "Lune gibbeuse";

 }

else if($phase >= 73.5 && $phase <= 77.49)

 {

 $NomPhase = "Dernier quartier";

 }

else if($phase >= 77.5 && $phase <= 97.49)

 {

 $NomPhase = "Dernier croissant";

 }

else

 {

 $NomPhase = "Nouvelle Lune";

 }



return $NomPhase;

}



function JoursAvantNL($phase) { //calcule le nombre de jours avant la nouvelle Lune

 $val = round((1 - $phase / 100) * SYNODIC,2);

 return $val;	

}



function JoursAvantPL($pourcentagePL) { //calcule le nombre de jours avant la pleine Lune

 $val = round((1 - $pourcentagePL / 100) * SYNODIC,2);

 return $val;	

}

?>

Lien vers le commentaire
Partager sur d’autres sites

  • 1 année plus tard...

Salut la room.

 

je passais sur votre forum car je collecte différentes info concernant les lunaisons etc...

 

Voilà le prob.

 

Je viens d'integrer les fonctions dans un calendrier mensuel.

donc au moment de l'itération des dates pour le mois selectionné, j'envoie la date pointée afin de recupérer la n° du jour de lunaison.

 

Ca marche nickel, mais hélas ce n'est pas juste, pour le test du mois de juin 2005.

la nouvelle lune tombe juste mais pas la pleine lune(-1jr).

 

J'ai pensé que c'etait dû à l'heure passée, rien n'y fait, et pour le moment je traite les dates avec 12:00:00 Hr et ca ne colle toujours pas.

 

Donc c'est pas glop ! sorry.

 

Le systeme suivant :

 

http://perso.wanadoo.fr/pgj/phaselune.htm

 

fonctionne correctement. A étudier....

 

Cordialement.

Jean François.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 année plus tard...

Moi je tente de programmer un script en php mais j'ai une erreur de 2h aujourd'hui et qui va jusqu'a 17h pour janvier 2012. Si vous pouviez m'aider; Ci dessous le code source un maximum commenté.

 

 

 

<?php

   $periode = (1/((1/27.322)-(1/365.25))) *24*60*60;  //formule de copernic donnant la durée d'une periode lunaire ,environ 29.5j

   //time de nouvelle lune 592500

   //------------------------------------------------//
   //Explication time Stamp
   // Le Timestamp est un compteur servant de référence temporelle.
   //Il a pour base le 01 Janvier 1970 à 00h00 UTC (soit GMT) et depuis, ce compteur s'incrémente de 1 toutes les secondes.
   // La fonction time() renvoi donc le nombre de secondes qui se sont ecoulées depuis le 01/01/1970 à 00h00 GMT.

   //Info: La première nouvelle lune suivant le déclenchement du timestamp était le 7 janvier 1970 à 20h35m UTC se qui 
   // donne 592500 seconde, 6 jour complets + 20h35min sois 6*24*3600+20*3600+35*60=252500
   //Le timestamp de cette date est égale au nombre de secondes qui se sont déroulé depuis le 01/01/1970 sois 592500.



   $tps_depuis_nouvelle_lune = (time() - 592500) % $periode ;

   //Je calcul le temps qui s'est déroulé depuis la dernière nouvelle lune. 
   //Pour cela je prend le timestamp actuel ( fonction time() ) moins le temps qu'il s'est écoulé entre le déclanchement du timestamp et la première nouvelle lune car en 70 ils ont pas déclenché le timestamp au moment de la nouvelle lune et je fais modulo de la période, se qui me donne le reste en seconde. Avec ca j'ai le nombre de secondes qui s'est ecoulé depuis la dernière nouvelle lune.



   echo "le temps passé depuis la dernière nouvelle lune est ". $tps_depuis_nouvelle_lune. " secondes";

   $tps_restant_avant_prochaine = $periode - $tps_depuis_nouvelle_lune;
   // le temps restant avant la prochaine nouvelle lune <=>  temp restant = periode - temp ecoulé



   echo "<br>";
   echo "time stamp". time(); //J'affiche le timestamp actuel
   echo "<br>";

   echo " le temps qu'il reste avant la prochaine est ". $tps_restant_avant_prochaine. " secondes";
   // J'affiche le temps restant avant la prochaine nouvelle lune.
   echo "<br>";



   echo "Date et heure de la prochaine nouvelle lune". date('d/m/Y H:i:s', time() + $tps_restant_avant_prochaine);
   // J'affiche la date et l'heure de la prochaine nouvelle lune et la j'ai une erreur de 2 heures pour le moi actuelle et qui va en grandissant jusqu'a 17h d'erreur pour l'année 2012. C'est la que j'ai besoin de votre aide. Je peu avoir une erreur en prog comme en astro mais je vois pas ou.

//Site utiles:
//convertisseur timestamp: http://loranger.free.fr/convertisseur/index.php
// Calendrier de la lune : http://www.imcce.fr/page.php?nav=fr/ephemerides/astronomie/phases_lune/index.php


?>

Lien vers le commentaire
Partager sur d’autres sites

bonjour,

je n'ai pas encore lu tout ton script, mais déjà je pense qu'il y a un problème au début: la durée du jour n'est pas de 24h mais 23h56mn04s soit 86164 s...

edit: en fait non c'est la période de rotation de la Terre; je ne sais pas s'il faut prendre 86164 ou 86400 ??

edit 2: il vaudrait mieux prendre 365.256 au lieu de 365.25 pour obtenir une période synodique plus précise

Lien vers le commentaire
Partager sur d’autres sites

Je pense que le problème vient de la précision sur la période en secondes.

Sur une durée de 37 ans un écart de 2 heures correspond à une erreur d'environ 15s sur la période soit 0,000 012 jour.

Il faudrait utiliser directement une valeur précise de la période synodique (29,53058868 jours) comme l'a fait astro-fr.net

Sinon, je ne vois pas d'erreur dans le programme

Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois plus tard...

ca ne peut pas être précis comme ça, car ça calcule une révolution sinodique comme si elle était toujours égale à "$periode = (1/((1/27.322)-(1/365.25))) *24*60*60;"... mais pas du tout... en fait, ce serait bien trop simple.

J'ai su faire en VB, je sais que certains s'en sont approché en javascript... en php ça me parait difficile (environ 3000 lignes de code)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 année plus tard...
  • 1 année plus tard...

Bonjour,

 

Je cherche depuis quelque temps le moyen de calculer les phases de la Lune.

J'ai trouvé deci dela des réponses mais jamais vraiment satisfaisantes.

Notamment un document dérivé de l'algorithme de Jean Meeus. Mais il y a des erreurs dans les résultats et il est assez peu explicite sur certains calculs. Aussi je n'arrive rien à en faire.

 

Je souhaiterais le construire en VB pour Excel, mais je n'ai pas l'algorithme qui va bien.:cry:

Quelqu'un peut-il me dire où je puis le trouver ?

 

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.