begin process at 2012 02 13 03:14:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date / Heure

 > CALCULER LA PHASE DE LA LUNE - MOON PHASE

CALCULER LA PHASE DE LA LUNE - MOON PHASE


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date / Heure Niveau :Débutant Date de création :10/04/2009 Vu :5 963

Auteur : CristianCCDB

Ecrire un message privé
Site perso
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Ce Scripte vous permettra de connaître, à une date donnée, l'illumination de la Lune, son age, sa distance en km par rapport à la Terre, son angle en degrés, sa distance par rapport au soleil, et son angle par rapport au soleil.

Adaptation en php du fameux et excellent scripte Astro-MoonPhase de Brett Hamilton écrit en Perl.
http://search.cpan.org/~brett/Astro-MoonPhas e-0.60/

Source

  • <?
  • /*
  • Adaptation en php du fameux et excellent scripte Astro-MoonPhase de Brett Hamilton écrit en Perl.
  • http://search.cpan.org/~brett/Astro-MoonPhase-0.60/
  • Ce Scripte vous permettra de connaître, à une date donnée, l'illumination de la Lune, son age,
  • sa distance en km par rapport à la Terre, son angle en degrés, sa distance par rapport au soleil,
  • et son angle par rapport au soleil.
  • */
  • 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 calcules
  • # Astronomical constants.
  • $Epoch = 2444238.5; # 1980 January 0.0
  • # Constants defining the Sun's apparent orbit.
  • $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
  • # Elements of the Moon's orbit, 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
  • # Calculation of the Sun's position.
  • $Day = $pdate - $Epoch; # date within epoch
  • $N = Moon::fixangle((360 / 365.2422) * $Day); # mean anomaly of the Sun
  • $M = Moon::fixangle($N + $Elonge - $Elongp); # convert from perigee
  • # co-ordinates to epoch 1980.0
  • $Ec = Moon::kepler($M, $Eccent); # solve equation of Kepler
  • $Ec = sqrt((1 + $Eccent) / (1 - $Eccent)) * tan($Ec / 2);
  • $Ec = 2 * Moon::todeg(atan($Ec)); # true anomaly
  • $Lambdasun = Moon::fixangle($Ec + $Elongp); # Sun's geocentric ecliptic
  • # longitude
  • # Orbital distance factor.
  • $F = ((1 + $Eccent * cos(Moon::torad($Ec))) / (1 - $Eccent * $Eccent));
  • $SunDist = $Sunsmax / $F; # distance to Sun in km
  • $SunAng = $F * $Sunangsiz; # Sun's angular size in degrees
  • # Calculation of the Moon's position.
  • # Moon's mean longitude.
  • $ml = Moon::fixangle(13.1763966 * $Day + $Mmlong);
  • # Moon's mean anomaly.
  • $MM = Moon::fixangle($ml - 0.1114041 * $Day - $Mmlongp);
  • # Moon's ascending node mean longitude.
  • $MN = Moon::fixangle($Mlnode - 0.0529539 * $Day);
  • # Evection.
  • $Ev = 1.2739 * sin(Moon::torad(2 * ($ml - $Lambdasun) - $MM));
  • # Annual equation.
  • $Ae = 0.1858 * sin(Moon::torad($M));
  • # Correction term.
  • $A3 = 0.37 * sin(Moon::torad($M));
  • # Corrected anomaly.
  • $MmP = $MM + $Ev - $Ae - $A3;
  • # Correction for the equation of the centre.
  • $mEc = 6.2886 * sin(Moon::torad($MmP));
  • # Another correction term.
  • $A4 = 0.214 * sin(Moon::torad(2 * $MmP));
  • # Corrected longitude.
  • $lP = $ml + $Ev + $mEc - $Ae + $A4;
  • # Variation.
  • $V = 0.6583 * sin(Moon::torad(2 * ($lP - $Lambdasun)));
  • # True longitude.
  • $lPP = $lP + $V;
  • # Corrected longitude of the node.
  • $NP = $MN - 0.16 * sin(Moon::torad($M));
  • # Y inclination coordinate.
  • $y = sin(Moon::torad($lPP - $NP)) * cos(Moon::torad($Minc));
  • # X inclination coordinate.
  • $x = cos(Moon::torad($lPP - $NP));
  • # Ecliptic longitude.
  • $Lambdamoon = Moon::todeg(atan2($y, $x));
  • $Lambdamoon += $NP;
  • # Ecliptic latitude.
  • $BetaM = Moon::todeg(asin(sin(Moon::torad($lPP - $NP)) * sin(Moon::torad($Minc))));
  • # Calculation of the phase of the Moon.
  • # Age of the Moon in degrees.
  • $MoonAge = $lPP - $Lambdasun;
  • # Phase of the Moon.
  • $MoonPhase = (1 - cos(Moon::torad($MoonAge))) / 2;
  • # Calculate distance of moon from the centre of the Earth.
  • $MoonDist = ($Msmax * (1 - $Mecc * $Mecc)) /
  • (1 + $Mecc * cos(Moon::torad($MmP + $mEc)));
  • # Calculate Moon's angular diameter.
  • $MoonDFrac = $MoonDist / $Msmax;
  • $MoonAng = $Mangsiz / $MoonDFrac;
  • # Calculate Moon's parallax.
  • $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 :
  • //Pour le 11 Avril 2009 à 00h00
  • list($MoonPhase, $MoonAge, $MoonDist, $MoonAng, $SunDist, $SunAng, $mpfrac) = Moon::phase(2009, 04, 11, 00, 00, 01);
  • echo "La Lune est éclairée à ".number_format($MoonPhase*100, 2, ',', '')."%"."<br>";
  • echo "Son age est de ".number_format($MoonAge, 0, ',', '')." jours"."<br>";
  • echo "Et elle se situe à une distance de ".number_format($MoonDist, 0, ',', '')." km par rapport à la Terre."."<br>";
  • //Vous pouvez voir le scripte en fonctionnement sur www.CropCirclesDataBase.org
  • //dans la rubrique calendrier.
  • ?>
<?
/*
Adaptation en php du fameux et excellent scripte Astro-MoonPhase de Brett Hamilton écrit en Perl.
http://search.cpan.org/~brett/Astro-MoonPhase-0.60/

Ce Scripte vous permettra de connaître, à une date donnée, l'illumination de la Lune, son age, 
sa distance en km par rapport à la Terre, son angle en degrés, sa distance par rapport au soleil, 
et son angle par rapport au soleil.

*/
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 calcules

		# Astronomical constants.
		$Epoch					= 2444238.5;		# 1980 January 0.0

		# Constants defining the Sun's apparent orbit.
		$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

		# Elements of the Moon's orbit, 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


		# Calculation of the Sun's position.

		$Day = $pdate - $Epoch;										# date within epoch
		$N = Moon::fixangle((360 / 365.2422) * $Day);				# mean anomaly of the Sun
		$M = Moon::fixangle($N + $Elonge - $Elongp);				# convert from perigee
										# co-ordinates to epoch 1980.0
		$Ec = Moon::kepler($M, $Eccent);							# solve equation of Kepler
		$Ec = sqrt((1 + $Eccent) / (1 - $Eccent)) * tan($Ec / 2);
		$Ec = 2 * Moon::todeg(atan($Ec));							# true anomaly
		$Lambdasun = Moon::fixangle($Ec + $Elongp);					# Sun's geocentric ecliptic
										# longitude
		# Orbital distance factor.
		$F = ((1 + $Eccent * cos(Moon::torad($Ec))) / (1 - $Eccent * $Eccent));
		$SunDist = $Sunsmax / $F;									# distance to Sun in km
		$SunAng = $F * $Sunangsiz;									# Sun's angular size in degrees


		# Calculation of the Moon's position.

		# Moon's mean longitude.
		$ml = Moon::fixangle(13.1763966 * $Day + $Mmlong);

		# Moon's mean anomaly.
		$MM = Moon::fixangle($ml - 0.1114041 * $Day - $Mmlongp);

		# Moon's ascending node mean longitude.
		$MN = Moon::fixangle($Mlnode - 0.0529539 * $Day);

		# Evection.
		$Ev = 1.2739 * sin(Moon::torad(2 * ($ml - $Lambdasun) - $MM));

		# Annual equation.
		$Ae = 0.1858 * sin(Moon::torad($M));

		# Correction term.
		$A3 = 0.37 * sin(Moon::torad($M));

		# Corrected anomaly.
		$MmP = $MM + $Ev - $Ae - $A3;

		# Correction for the equation of the centre.
		$mEc = 6.2886 * sin(Moon::torad($MmP));

		# Another correction term.
		$A4 = 0.214 * sin(Moon::torad(2 * $MmP));

		# Corrected longitude.
		$lP = $ml + $Ev + $mEc - $Ae + $A4;

		# Variation.
		$V = 0.6583 * sin(Moon::torad(2 * ($lP - $Lambdasun)));

		# True longitude.
		$lPP = $lP + $V;

		# Corrected longitude of the node.
		$NP = $MN - 0.16 * sin(Moon::torad($M));

		# Y inclination coordinate.
		$y = sin(Moon::torad($lPP - $NP)) * cos(Moon::torad($Minc));

		# X inclination coordinate.
		$x = cos(Moon::torad($lPP - $NP));

		# Ecliptic longitude.
		$Lambdamoon = Moon::todeg(atan2($y, $x));
		$Lambdamoon += $NP;

		# Ecliptic latitude.
		$BetaM = Moon::todeg(asin(sin(Moon::torad($lPP - $NP)) * sin(Moon::torad($Minc))));

		# Calculation of the phase of the Moon.

		# Age of the Moon in degrees.
		$MoonAge = $lPP - $Lambdasun;

		# Phase of the Moon.
		$MoonPhase = (1 - cos(Moon::torad($MoonAge))) / 2;

		# Calculate distance of moon from the centre of the Earth.

		$MoonDist = ($Msmax * (1 - $Mecc * $Mecc)) /
			(1 + $Mecc * cos(Moon::torad($MmP + $mEc)));

		# Calculate Moon's angular diameter.

		$MoonDFrac = $MoonDist / $Msmax;
		$MoonAng = $Mangsiz / $MoonDFrac;

		# Calculate Moon's parallax.

		$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 :

//Pour le 11 Avril 2009 à 00h00
list($MoonPhase, $MoonAge, $MoonDist, $MoonAng, $SunDist, $SunAng, $mpfrac) = Moon::phase(2009, 04, 11, 00, 00, 01);
echo "La Lune est éclairée à ".number_format($MoonPhase*100, 2, ',', '')."%"."<br>";
echo "Son age est de ".number_format($MoonAge, 0, ',', '')." jours"."<br>";
echo "Et elle se situe à une distance de ".number_format($MoonDist, 0, ',', '')." km par rapport à la Terre."."<br>";


//Vous pouvez voir le scripte en fonctionnement sur www.CropCirclesDataBase.org
//dans la rubrique calendrier.
?>

 Conclusion

Vous pouvez voir le scripte en fonctionnement sur www.CropCirclesDataBase.org dans la rubrique calendrier.


 Sources de la même categorie

Source avec une capture AGENDA GRAPHIQUE SIMPLE (DÉBUTANT) À INTÉGRER par NicomakM
CALCUL DU NOMBRE DE JOURS CONTENUS DANS L'INTERSECTION DE DE... par curphey
CALENDRIER EN 70 LIGNES par tchconst
Source avec Zip CALENDRIER par gabay
CALENDRIER SIMPLE par manuche

Commentaires et avis

Commentaire de FredT le 11/04/2009 12:43:49

Salut, ton script m'interesse fortement pour mettre simplement juste la phase de la lune dans un calendrier pour un application concernant la peche.
Quelques remarques:
1) Ca manque un peu (non beaucoup) de POO. L'usage de ta classe est pas évident. Personnellement, je remplacerai le return array() par autant de getters que de value. Ensuite, y manquerait éventuellement un __construct($date). Evidement chaque getter bien commenté avec des phpdoc afin de facilement retrouver unité et type renvoyé.
2) Ta classe me parait très complète, j'apprécie. Mais donc plutot réservé pour les connaisseurs en astronomie, ce n'est pas mon cas. Donc dans les meme phpdoc des getters, Des explications techniques (ou astrologique) seraient bienvenues. Par exemples l'age et les angles, c'est par rapport a quoi?

Commentaire de LeFauve42 le 14/04/2009 13:07:26 8/10

Pas mal du tout, et je recherchais certains de ces algorithmes depuis longtemps, mais qu'appelles-tu l'angle de la Lune exactement ?

Si c'est l'inclinaison de son aspect, ca depend de la position de l'observateur, non ?

FredT: L'age de la Lune correspond au nombre de jours depuis la derniere "Nouvelle Lune" (Quand on ne la voit pas).

Eric

Commentaire de CristianCCDB le 24/04/2009 16:03:37

Salut,

Merci pour vos commentaires,

@FredT, oui niveau POO le script n'est pas un exemple à suivre. J'ai utilisé le style POO uniquement pour avoir une syntaxe simple lorsqu'on appelle le scripte, la classe Moon me sert de centenaire pour toutes mes fonctions sur la Lune, si par exemple j'ai une autre fonction pour afficher une photo de la lune elle s'appellera Moon::photo(...), etc. C'est avant tout un style programmation.

$MoonAng : L'angle est une unité astronomique (http://en.wikipedia.org/wiki/Angular_diameter). Pour faire simple plus la Lune est proche de la Terre, plus elle sera plus grosse pour l'observateur donc plus son angle sera grand. Ici, l'angle est donnée pour un observateur au centre de la Terre (qui a très chaud), vous trouverez plus d'infos sur le site du script original en Perl :
http://search.cpan.org/dist/Astro-MoonPhase/MoonPhase.pm

Cristian

Commentaire de CristianCCDB le 24/04/2009 16:08:04

PS: la distance aussi est donné par raport au centre de la Terre,
Personnellement, je n'utilise que la phase de la Lune, donc je n'ai pas fait attention aux autre valeurs.
J'ai quand même traduit tout le script, ça peut toujours servir à qn.

Plus d'infos :
$MoonPhase:
the terminator phase angle as a percentage of a full circle (i.e., 0 to 1)

$MoonIllum: the illuminated fraction of the Moon's disc
$MoonAge:   the Moon's age in days and fraction
$MoonDist:  the distance of the Moon from the centre of the Earth
$MoonAng:   the angular diameter subtended by the Moon as seen by an observer at the centre of the Earth.
$SunDist:   the distance from the Sun in km
$SunAng:    the angular size of Sun in degrees

Commentaire de flapierr le 10/09/2009 10:30:14

Bonjour,

Je suis intéressé par un code qui me donne la phase et la position de la lune pour un observateur situé à un certain endroit de la terre. J'ai regardé votre code qui fournit la phase de la lune. Cependant, cette phase dépend de l'endroit où l'observateur est situé sur la terre. Or, votre code ne demande pas de fournir cet endroit. Donc, je suppose que l'observateur est situé qq part sur la terre mais où?

Autre chose, auriez-vous un code qui calcule la position de la lune (lat, lon)?

Merci d'avance pour votre réponse.

Commentaire de LeFauve42 le 10/09/2009 11:36:55

Salut Flapierr,

Je ne pense pas que la position de l'utilisateur influance la phase de la Lune (ou alors tres peu), mais par contre ca influence l'angle sous lequel on on la voit (le croissant peut etre par exemple a gauche dans l'hemisphere nord, a droite dans l'hemisphere sud ou en bas (ou en haut) sur l'equateur).

Je cherche egalement ce genre d'information (calculer l'angle de la Lune selon la position de l'observateur). Si par hasard tu trouvais, n'hesite pas a poster ici :o)

Le mieux que j'ai trouve pour l'instant, mais je n'ai pas eu le temps de regarder en details, c'est les sources de xmoontool, un outil Unix qui affiche en temps reel des tas d'infos sur la Lune (mais pas celles que je cherche...).

Eric

Commentaire de LeFauve42 le 10/09/2009 11:40:19

Petite precision: L'angle ne depends pas directement de la latitude, mais de la position par rapport au plan elyptique de notre systeme solaire :o)

Dans certains endroits, comme Brisbane par exemple, il peut arriver qu'en quelques heures la Lune passe d'un croissant "normal" (pour les latitudes Francaises) a un superbe smiley.

Eric

Commentaire de dreamsworks le 22/11/2009 16:05:48 8/10

Tres bon code, mais j'aimerais le completer afin qu'il puisse calculer l'heure du lever et du coucher de la lune, ainsi que le nom de la phase (pleine lune, premier croissant...). Comment faire ?

Commentaire de dreamsworks le 28/11/2009 15:15:50

J'ai réussi à nommer la phase, mais il me faudrait pouvoir calculer les prochaines lunaisons ainsi que, si possible, le prochain apogée et périgée et les prochain noeud lunaire, afin d'obtenir une information complète. Pouvez vous m'aider ?

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,014 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales