Calcul des phases lunaire pour la date du jour

Programmation d'applications complexes
Avatar de l’utilisateur
PhM
Messages : 120
Inscription : dim. 08/déc./2019 10:50

Calcul des phases lunaire pour la date du jour

Message par PhM »

Bonjour,

Petit programme fonctionnel de calcul des phases lunaire pour la date du jour pour l'hémisphère nord (Paris).

Code : Tout sélectionner

; ----------- Calcul des phases lunaire pour la date du jour ----------
;                      pour l'hémisphère nord (Paris)
;       Site de contrôle : https://starwalk.space/fr/moon-calendar
;          Ph. Mijon - septembre 2025 - PB 6.21 sur Windows 11
; ---------------------------------------------------------------------

; -------------------------- Déclaration des procédures de calcul et données fixes
Declare.f AgeLune(annee, mois, jour)
Declare.s PhaseLune(age.f)
Declare.f IlluminationLune(age.f)

Global RefJulien = 2451550.1     ; Nouvelle lune de référence du 6 janvier 2000 à 14h24
Global Lunaison  = 29.530588853  ; Longueur du mois lunaire 29j 12h 44m 2,9s

; -------------------------- Calcul de la phase lunaire du jour

annee = Year(Date())
mois = Month(Date())
jour = Day(Date())

age.f = AgeLune(annee, mois, jour)
illumination.f = IlluminationLune(age.f)
phase$ = PhaseLune(age.f)

MessageRequester("Phase Lunaire du " + Str(jour) + "/" + Str(mois) + "/" + Str(annee), "La Lune est en phase : " + phase$ + " (" + StrF(illumination.f, 1) + "% illuminée)")

End



; -------------------------- Calcul de l'âge lunaire avec correction

Procedure.f AgeLune(annee, mois, jour)
  
  If mois <= 2
    annee = annee - 1
    mois = mois + 12
  EndIf

  a = annee / 100
  b = 2 - a + a / 4
  JL = Int(365.25 * (annee + 4716)) + Int(30.6001 * (mois + 1)) + jour + b - 1524.5

  age.f = Mod(JL - RefJulien, Lunaison)
  
  If age.f < 0
    age.f = age.f + Lunaison
  EndIf

  ; Correction simple de l’anomalie moyenne
  M = 2 * #PI * age.f / Lunaison
  correction.f = 0.5 * Sin(M) - 0.25 * Sin(2 * M)
  age.f = age.f + correction.f

  ; Facteur de correction pour coller aux données observées
  ; aux coordonnées de Paris (Lat:48.86667 / Lon:2.33333)
  age.f = age.f + 0.56

  ProcedureReturn age.f
EndProcedure

; -------------------------- Détermination de la phase lunaire

Procedure.s PhaseLune(age.f)
  
  If age.f < 1.84566
    phase$ = "🌑 Nouvelle lune"
  ElseIf age.f < 5.53699
    phase$ = "🌒 Premier croissant"
  ElseIf age.f < 9.22831
    phase$ = "🌓 Premier quartier"
  ElseIf age.f < 12.91963
    phase$ = "🌔 Gibbeuse croissante"
  ElseIf age.f < 16.61096
    phase$ = "🌕 Pleine lune"
  ElseIf age.f < 20.30228
    phase$ = "🌖 Gibbeuse décroissante"
  ElseIf age.f < 23.99361
    phase$ = "🌗 Dernier quartier"
  ElseIf age.f < 27.68493
    phase$ = "🌘 Dernier croissant"
  Else
    phase$ = "🌑 Nouvelle lune"
  EndIf

  ProcedureReturn phase$
EndProcedure

; -------------------------- Calcul du pourcentage d'illumination

Procedure.f IlluminationLune(age.f)

  illumination.f = (1 - Cos(2 * #PI * age.f / Lunaison)) / 2 * 100
  
  ProcedureReturn illumination.f
EndProcedure


Avatar de l’utilisateur
Jacobus
Messages : 1563
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Calcul des phases lunaire pour la date du jour

Message par Jacobus »

Bonjour,
Sympa ton application :)
Merci pour le partage.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
MLD
Messages : 1125
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Calcul des phases lunaire pour la date du jour

Message par MLD »

Sympa
Merci du partage
Avatar de l’utilisateur
venom
Messages : 3139
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Calcul des phases lunaire pour la date du jour

Message par venom »

Bonjour.

Je n'en ai pas d'utilité, mais merci pour le partage c'est cool, ça peut toujours être utile. 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
PhM
Messages : 120
Inscription : dim. 08/déc./2019 10:50

Re: Calcul des phases lunaire pour la date du jour

Message par PhM »

Amélioration du premier programme qui gagne en précision dans cette version :

Code : Tout sélectionner


; ----------- Calcul des phases lunaires pour la date du jour ----------
;                      pour l'hémisphère nord (Paris)
;    Version améliorée PhM - septembre 2025 - PB 6.21 sur Windows 11
; ----------------------------------------------------------------------

Declare.f AgeLune(annee, mois, jour)
Declare.s PhaseLune(age.f)
Declare.f IlluminationLune(age.f)

Global RefJulien = 2451550.1     ; Nouvelle lune de référence du 6 janvier 2000 à 14h24 UTC
Global Lunaison  = 29.530588853  ; Longueur moyenne du mois lunaire

; -------------------------- Date du jour
annee = Year(Date())
mois = Month(Date())
jour = Day(Date())

age.f = AgeLune(annee, mois, jour)
illumination.f = IlluminationLune(age.f)
phase$ = PhaseLune(age.f)

MessageRequester("Phase Lunaire du " + Str(jour) + "/" + Str(mois) + "/" + Str(annee),
                 "Âge lunaire : " + StrF(age.f, 1) + " jours" + #LF$ +
                 "Illumination : " + StrF(illumination.f, 1) + "%" + #LF$ +
                 "Phase : " + phase$)

End

; -------------------------- Calcul de l'âge lunaire avec correction
Procedure.f AgeLune(annee, mois, jour)
  If mois <= 2
    annee - 1
    mois + 12
  EndIf

  a = annee / 100
  b = 2 - a + a / 4
  JL = Int(365.25 * (annee + 4716)) + Int(30.6001 * (mois + 1)) + jour + b - 1524.5

  age.f = Mod(JL - RefJulien, Lunaison)
  If age.f < 0
    age.f = age.f + Lunaison
  EndIf

  ; Correction de l’anomalie moyenne
  M = 2 * #PI * age.f / Lunaison
  correction.f = 0.5 * Sin(M) - 0.25 * Sin(2 * M)
  age.f = age.f + correction.f

  ; Ajustement empirique pour Paris
  age.f = age.f + 1.6 * Sin(2 * M)
  age.f = Mod(age.f, Lunaison)

  ProcedureReturn age.f
EndProcedure

; -------------------------- Calcul du pourcentage d'illumination
Procedure.f IlluminationLune(age.f)
  Protected correction.f = 0.953
  ProcedureReturn (1 - Cos(2 * #PI * age.f / Lunaison)) / 2 * 100 * correction
EndProcedure

; -------------------------- Détermination de la phase lunaire
Procedure.s PhaseLune(age.f)
  illumination.f = IlluminationLune(age.f)

  If illumination.f < 1
    phase$ = "🌑 Nouvelle lune"
  ElseIf illumination.f < 25 And age.f < 7.5
    phase$ = "🌒 Premier croissant"
  ElseIf illumination.f >= 25 And illumination.f < 50 And age.f < 9
    phase$ = "🌓 Premier quartier"
  ElseIf illumination.f >= 50 And illumination.f < 99 And age.f < 14.8
    phase$ = "🌔 Gibbeuse croissante"
  ElseIf illumination.f >= 99
    phase$ = "🌕 Pleine lune"
  ElseIf illumination.f >= 50 And age.f > 15
    phase$ = "🌖 Gibbeuse décroissante"
  ElseIf illumination.f >= 25 And age.f > 21
    phase$ = "🌗 Dernier quartier"
  ElseIf illumination.f < 25 And age.f > 22
    phase$ = "🌘 Dernier croissant"
  Else
    phase$ = "🌑 Nouvelle lune"
  EndIf

  ProcedureReturn phase$
EndProcedure


Avatar de l’utilisateur
SPH
Messages : 4951
Inscription : mer. 09/nov./2005 9:53

Re: Calcul des phases lunaire pour la date du jour

Message par SPH »

Merci pour le code. J'admire ton code bien structuré. Bravo :)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre