Page 1 sur 1

Calcul des phases lunaire pour la date du jour

Publié : ven. 12/sept./2025 7:38
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



Re: Calcul des phases lunaire pour la date du jour

Publié : ven. 12/sept./2025 9:36
par Jacobus
Bonjour,
Sympa ton application :)
Merci pour le partage.

Re: Calcul des phases lunaire pour la date du jour

Publié : ven. 12/sept./2025 15:10
par MLD
Sympa
Merci du partage

Re: Calcul des phases lunaire pour la date du jour

Publié : ven. 12/sept./2025 22:00
par venom
Bonjour.

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






@++

Re: Calcul des phases lunaire pour la date du jour

Publié : sam. 13/sept./2025 14:12
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



Re: Calcul des phases lunaire pour la date du jour

Publié : sam. 13/sept./2025 16:26
par SPH
Merci pour le code. J'admire ton code bien structuré. Bravo :)