IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Calcule lever coucher lunaire en PHP


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut Calcule lever coucher lunaire en PHP
    Bonjour,

    Pour un projet astronomique, je cherche une petite formule (algo) magique permettant de calculer le levé/couché lunaire comme le fait la fonction native PHP date_sun_info() pour le soleil ...

    J'ai trouver quelques sources concernant le calcule de la phase/distance/inclinaison/age lunaire pour une date donnée mais rien pour les :

    - Les crépuscules
    - Les nœuds
    - Les apogées
    - Les périgées

    Ceci est possible car certains sites proposent et génère ses informations en PHP.

    Merci d'avance pour votre aide.

    Bien cordialement

  2. #2
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Par défaut
    tu as le choix, pour peu que tu fasses une recherche en anglais t’obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    //=========================================================================
    // decode WD %moonage% tag and return a text description for the moon phase name
    // "Moon age: 10 days,10 hours,41 minutes,80%"
     
    function moonphase ($WDmoonage) {
     
      preg_match_all('|(\d+)|is',$WDmoonage,$matches);
    //  print "<!-- matches=\n" . print_r($matches,true) . "-->\n";
      $mdays = $matches[1][0];
      $mhours = $matches[1][1];
      $mmins = $matches[1][2];
      $mpct  = $matches[1][3];
     
      $mdaysd = $mdays + ($mhours / 24) + ($mmins / 1440);
      // Definitions from http://www.answers.com/topic/lunar-phase
      //  * Dark Moon - Not visible
      //  * New Moon - Not visible, or traditionally, the first visible crescent of the Moon
      //  * Waxing Crescent Moon - Right 1-49% visible
      //  * First Quarter Moon - Right 50% visible
      //  * Waxing gibbous Moon - Right 51-99% visible
      //  * Full Moon - Fully visible
      //  * Waning gibbous Moon - Left 51-99% visible
      //  * Third Quarter Moon - Left 50% visible
      //  * Waning Crescent Moon - Left 1-49% visible
      //  * New Moon - Not visible
     
      if ($mdaysd <= 29.53/2) { // increasing illumination
        $ph = "Waxing";
    	$qtr = "First";
      } else { // decreasing illumination
        $ph = "Waning";
    	$qtr = "Last";
      }
     
      if ($mpct < 1 ) { return("New Moon"); }
      if ($mpct <= 49) { return("$ph Crescent"); }
      if ($mpct < 51) { return("$qtr Quarter"); }
      if ($mpct < 99) { return("$ph Gibbous"); }
    	return("Full Moon");
     }
    ou mieux encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    <?php
    /*
    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>";
    ?>
    et le lien du topic :
    http://www.wxforum.net/index.php?topic=2233.0

  3. #3
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Bonjour,

    J'ai trouver quelques sources concernant le calcule de la phase/distance/inclinaison/age lunaire pour une date donnée mais rien pour les
    Oui je connais les deux codes, d'ailleurs j'utilise la deuxième class qui est assez précise mais cela reste uniquement pour calculer les phases lunaire...

    Cependant il me reste toujours ses informations à calculer:

    - Apogée
    - Perigée
    - Noeud lunaire
    - crépuscules

    J'ai beau googlelisé dans toute les langues je trouve que des sources pour calculer les phases lunaire... et aucune formule adapter pour PHP ...

  4. #4
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Par défaut
    autant pour moi, mais la classe au dessus te donnes deja la distance de la lune à la terre, admettons que tu fasses une sorte de calendrier, pour chaque nouvelle lune tu as deux variables l'une pour la distance minimale l'autre pour la distance maximale, tu boucles sur chaque cycle et tu testes ta distance si elle est plus grande que la valeur maximale tu récupère cette nouvelle distance, de même pour la distance minimale si la nouvelle valeur est plus petite, et tu stock dans deux autres variables le jours correspondant pour chaque distance et tu obtiens l’apogée et le périgée...
    pour les deux autres je verrai après une bonne nuit de sommeil...

  5. #5
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Je vais en faire autant et reprends le code demain ...

    Merci encore cdlt

  6. #6
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Donc les limites sont :
    Le point de l’orbite lunaire le plus proche de la terre s’appelle périgée, et le Point le plus éloigné, apogée. La distance au périgée égale 363297.258 km, et à l’apogée égale 405500.484 km; et la distance moyenne est de 384402.06 km
    Par contre je n'ai pas saisi ton exemple de comparaison ...

Discussions similaires

  1. Calcul d'itinéraires dans application PHP: Google/Yahoo/BingMaps vs logiciel Mappoint?
    Par drthodt dans le forum SIG : Système d'information Géographique
    Réponses: 4
    Dernier message: 08/09/2014, 17h33
  2. Formulaire de calcul en JS à convertir en PHP
    Par Dyvaa dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2014, 12h38
  3. Calculer date intervalles de date php
    Par Blueyes50 dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2012, 15h45
  4. Calcul simple sur une page: php ou js ?
    Par branlot83 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/10/2012, 13h43
  5. calcul de produit scalaire sous PHP
    Par abegault dans le forum Langage
    Réponses: 5
    Dernier message: 21/05/2008, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo