Programmation d'applications complexes
PhM
Messages : 120 Inscription : dim. 08/déc./2019 10:50
Message
par PhM » ven. 12/sept./2025 7:38
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
Jacobus
Messages : 1563 Inscription : mar. 06/avr./2004 10:35
Contact :
Message
par Jacobus » ven. 12/sept./2025 9:36
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.
MLD
Messages : 1125 Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne
Message
par MLD » ven. 12/sept./2025 15:10
Sympa
Merci du partage
venom
Messages : 3139 Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :
Message
par venom » ven. 12/sept./2025 22:00
Bonjour.
Je n'en ai pas d'utilité, mais merci pour le partage c'est cool, ça peut toujours être utile.
@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
PhM
Messages : 120 Inscription : dim. 08/déc./2019 10:50
Message
par PhM » sam. 13/sept./2025 14:12
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
SPH
Messages : 4951 Inscription : mer. 09/nov./2005 9:53
Message
par SPH » sam. 13/sept./2025 16:26
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