Astrologie chinoise

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Astrologie chinoise

Message par Micoute »

Bonjour à tous,

je souhaite faire un logiciel d'astrologie chinoise et sachant qu'un cycle qui commence par 1, dure 60 ans, j'aimerais trouver une équation qui me permette de trouver par exemple en quelle année astrologique je suis né, je sais que c'est le tigre de métal et que c'est le cycle 27, mais comment puis-je trouver le cycle sachant que je suis en juin 1950 et que l'année chinoise commence le 4 février et se termine le 3 février de l'année suivante, donc début du cycle (1950-27) + 1 = 1924, c'est tout ce que j'ai trouvé, mais je voudrais le mettre en pratique, c'est pourquoi je m'adresse à vous pour encore solliciter votre aide bienveillante et je vous en remercie d'avance.

Code : Tout sélectionner

;Astrologie chinoise

Structure sBrancheTerrestre
  Array tSigne.s(11)
EndStructure

Structure sTigeCeleste
  Array tElement.s(9)
EndStructure

Structure sYinYang
  Array tYY.s(1)
EndStructure  

Global *Signe.sBrancheTerrestre = AllocateMemory(SizeOf(sBrancheTerrestre))
Global *Element.sTigeCeleste = AllocateMemory(SizeOf(sTigeCeleste))
Global *YY.sYinYang = AllocateMemory(SizeOf(sYinYang))

Procedure Init()
  InitializeStructure(*Signe, sBrancheTerrestre)
  *Signe\tSigne(0) = "Rat"
  *Signe\tSigne(1) = "Boeuf"
  *Signe\tSigne(2) = "Tigre"
  *Signe\tSigne(3) = "Lapin"
  *Signe\tSigne(4) = "Dragon"
  *Signe\tSigne(5) = "Serpent"
  *Signe\tSigne(6) = "Cheval"
  *Signe\tSigne(7) = "Chèvre"
  *Signe\tSigne(8) = "Singe"
  *Signe\tSigne(9) = "Coq"
  *Signe\tSigne(10) = "Chien"
  *Signe\tSigne(11) = "Porc"
  
  InitializeStructure(*Element, sTigeCeleste)
  *Element\tElement(0) = "Bois"
  *Element\tElement(1) = "Bois"
  *Element\tElement(2) = "Feu"
  *Element\tElement(3) = "Feu"
  *Element\tElement(4) = "Terre"
  *Element\tElement(5) = "Terre"
  *Element\tElement(6) = "Métal"
  *Element\tElement(7) = "Métal"
  *Element\tElement(8) = "Eau"
  *Element\tElement(9) = "Eau"
  
  InitializeStructure(*YY, sYinYang)
  *YY\tYY(0) = "Yin"
  *YY\tYY(1) = "yang"
EndProcedure

Procedure Fin()
  FreeMemory(*Signe)
  FreeMemory(*Element)
  FreeMemory(*YY)
EndProcedure

Init()

For Cycle = 0 To 59
  Debug Str(Cycle + 1984) + " " +Str(Cycle + 1) + " = " + *YY\tYY(Cycle % 2) + " " + *Signe\tSigne(Cycle % 12) + " " + *Element\tElement(Cycle % 10)
Next Cycle

Fin()
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Astrologie chinoise

Message par Ollivier »

Code : Tout sélectionner

;****************************************************************************************************************************************************************************************************************************************************************************************
Debug StringField("rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc", ((Val(InputRequester("Naissance", "Année : ", "") ) - 700) % 12) + 1, ";")
( /!\ commence 1er janvier /!\ )
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Astrologie chinoise

Message par falsam »

@Ollivier : Tout faux :mrgreen:
J'ai testé mon signe et ce n'est pas le bon. (Du moins dans mon cas)

■ Exemple de Micoute né en 1950

-L'année 1949 commence le 29 Janvier 1949 et se termine le 16 Février 1950
Son signe astrologique chinois serait le Boeuf.

-L'année 1950 commence le 17 Février 1950 et se termine le 5 Février 1951
Son signe astrologique chinois serait le Tigre.

Comme tu peux le voir, ta formule ne fonctionne pas, le jour de naissance est nécessaire.
Micoute a écrit :je suis en juin 1950
son signe astrologique est le Tigre
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Astrologie chinoise

Message par falsam »

Voici ma proposition

Le principe initiale était simple : Calculer le modulo de l'année divisé par 12 et prendre le résultat de 0 à 11 pour trouver le signe zodiacal chinois. (0 : Chèvre, 1 : Singe, 2 : Coq, etc ....) Je n'invente rien, en trouve ça sur internet.

Code : Tout sélectionner

Signes$ = "Chévre,Singe,Coq,Chien,Cochon,Rat,Boeuf,Tigre,Lapin,Dragon,Serpent,Cheval" 

AA = 1950 ;Année de naissance de Micoute

Debug Mod(AA, 12)

Debug StringField(Signes$, Mod(AA, 12) + 1, ",")
Sauf que ce n'est pas forcément juste. (Voir les explications avec le commentaire précédent)

Il va falloir tenir compte de la date de fin de l'année lunaire (qui correspond à la veille du nouvel an chinois)
Ne sachant pas calculer la fin d'une année lunaire, j'ai fais référence à ce tableau http://wikipedia.qwika.com/en2fr/Chines ... and_Zodiac pour enregistrer dans une map la date de fin de chaque année 1900 à 2019.

L'année 2017 commence le 28 Janvier. Le signe zodiacal chinois est le Coq.

Code : Tout sélectionner

Signes$ = "Chévre,Singe,Coq,Chien,Cochon,Rat,Boeuf,Tigre,Lapin,Dragon,Serpent,Cheval" 

Structure MMJJ
  MM.s
  JJ.s
EndStructure
Global NewMap Grid.MMJJ()

Procedure GridAdd(AA, MM, JJ)
  AddMapElement(Grid(), Str(AA))
  Grid()\MM = Str(MM)
  Grid()\JJ = RSet(Str(JJ), 2, "0")
EndProcedure

GridAdd(1901,02,18)
GridAdd(1902,02,07)
GridAdd(1903,01,28)
GridAdd(1904,02,15)
GridAdd(1905,02,03)
GridAdd(1906,01,24)
GridAdd(1907,02,12)
GridAdd(1908,02,01)
GridAdd(1909,01,21)
GridAdd(1910,02,09)
GridAdd(1911,01,29)
GridAdd(1912,02,17)
GridAdd(1913,02,05)
GridAdd(1914,01,25)
GridAdd(1915,02,13)
GridAdd(1916,02,02)
GridAdd(1917,01,22)
GridAdd(1918,02,10)
GridAdd(1919,01,31)
GridAdd(1920,02,19)
GridAdd(1921,02,07)
GridAdd(1922,01,27)
GridAdd(1923,02,15)
GridAdd(1924,02,04)
GridAdd(1925,01,24)
GridAdd(1926,02,12)
GridAdd(1927,02,01)
GridAdd(1928,01,22)
GridAdd(1929,02,09)
GridAdd(1930,01,29)
GridAdd(1931,02,16)
GridAdd(1932,02,05)
GridAdd(1933,01,25)
GridAdd(1934,02,13)
GridAdd(1935,02,03)
GridAdd(1936,01,23)
GridAdd(1937,02,10)
GridAdd(1938,01,30)
GridAdd(1939,02,18)
GridAdd(1940,02,07)
GridAdd(1941,01,26)
GridAdd(1942,02,14)
GridAdd(1943,02,04)
GridAdd(1944,01,24)
GridAdd(1945,02,12)
GridAdd(1946,02,01)
GridAdd(1947,01,21)
GridAdd(1948,02,09)
GridAdd(1949,01,28)
GridAdd(1950,02,16)
GridAdd(1951,02,05)
GridAdd(1952,01,26)
GridAdd(1953,02,13)
GridAdd(1954,02,02)
GridAdd(1955,01,23)
GridAdd(1956,02,11)
GridAdd(1957,01,30)
GridAdd(1958,02,17)
GridAdd(1959,02,07)
GridAdd(1960,01,27)
GridAdd(1961,02,14)
GridAdd(1962,02,04)
GridAdd(1963,01,24)
GridAdd(1964,02,12)
GridAdd(1965,02,01)
GridAdd(1966,01,20)
GridAdd(1967,02,08)
GridAdd(1968,01,29)
GridAdd(1969,02,16)
GridAdd(1970,02,05)
GridAdd(1971,01,26)
GridAdd(1972,02,14)
GridAdd(1973,02,02)
GridAdd(1974,01,22)
GridAdd(1975,02,10)
GridAdd(1976,01,30)
GridAdd(1977,02,17)
GridAdd(1978,02,06)
GridAdd(1979,01,27)
GridAdd(1980,02,15)
GridAdd(1981,02,04)
GridAdd(1982,01,24)
GridAdd(1983,02,12)
GridAdd(1984,02,01)
GridAdd(1985,02,19)
GridAdd(1986,02,08)
GridAdd(1987,01,28)
GridAdd(1988,02,16)
GridAdd(1989,02,05)
GridAdd(1990,01,26)
GridAdd(1991,02,14)
GridAdd(1992,02,03)
GridAdd(1993,01,22)
GridAdd(1994,02,09)
GridAdd(1995,01,30)
GridAdd(1996,02,18)
GridAdd(1997,02,06)
GridAdd(1998,01,27)
GridAdd(1999,02,15)
GridAdd(2000,02,04)
GridAdd(2001,01,23)
GridAdd(2002,02,11)
GridAdd(2003,01,31)
GridAdd(2004,01,21)
GridAdd(2005,02,8)
GridAdd(2006,01,28)
GridAdd(2007,02,17)
GridAdd(2008,02,6)
GridAdd(2009,01,25)
GridAdd(2010,02,23)
GridAdd(2011,02,2)
GridAdd(2012,01,22)
GridAdd(2013,02,9)
GridAdd(2014,01,30)
GridAdd(2015,02,18)
GridAdd(2016,02,7)
GridAdd(2017,01,27)
GridAdd(2018,02,15)
GridAdd(2019,02,4)
GridAdd(2020,01,24)

;// Zone de test
AA = 2017
MM = 1
JJ = 28

FindMapElement(Grid(), Str(AA))

If Val(Grid()\MM + Grid()\JJ) <  Val(Str(MM) + RSet(Str(JJ), 2, "0")) 
  Debug StringField(Signes$, Mod(AA, 12)+2, ",")
Else
  Debug StringField(Signes$, Mod(AA, 12)+1, ",")
EndIf
Essayé avec le 27 janvier ......
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Astrologie chinoise

Message par Micoute »

Merci beaucoup falsam et Ollivier,

@falsam, je n'ai pas encore essayé ton programme, mais l'idée d'Ollivier m'a interloqué bien que je ne trouvais pas de solution, puis en dormant m'est venue la solution de cette équation, sachant que les années paires sont le début d'un élément qui dure 2 ans, donc yin et yang, et qu'une même triplette ne se reproduit que tous les soixante ans, j'en ai déduit qu'il devait en avoir la même quantité de chaque, comme nous avons 12 signes et 5 éléments, ça nous donne 12x5=60 combinaisons possible, j'ai dupliqué 5 fois les 12 signes et 12 fois les 5 éléments avec un modulo de 60 auquel j'ai ajouter un décalage pour que les signes et les éléments retombent sur les bonnes années.

En tous coup, au premier regard, ton programme me paraît adéquat avec ma demande et même davantage.

@Ollivier, ton raisonnement n'était pas faux, mais seulement les termes de l'équation.

Code : Tout sélectionner

Annee = Val(InputRequester("Référence", "Année : ", "") )
cycle = (Annee + 57) % 60
If cycle = 0
  cycle = 60
EndIf  
If Annee & 1 = 0
  yin_yang.s = "Yin"
Else
  yin_yang.s = "Yang"
EndIf

Txt_Sgn.s = "rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc;"
Txt_Sgn + "rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc;"
Txt_Sgn + "rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc;"
Txt_Sgn + "rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc;"
Txt_Sgn + "rat;boeuf;tigre;lapin;dragon;serpent;cheval;chèvre;singe;coq;chien;porc"
Signe.s = StringField(Txt_Sgn, (Annee + 21)  % 60, ";")

Txt_Elm.s = "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau;"
Txt_Elm + "bois;bois;feu;feu;terre;terre;métal;métal;eau;eau"
Element.s = StringField(Txt_Elm, cycle, ";")

Debug Str(Annee) + " => " + Str(cycle) + " " + yin_yang + " " +signe + " " + Element
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Astrologie chinoise

Message par falsam »

Tout comme le code d'Ollivier, le code est bon pour ton signe mais pas pour le mien par exemple.

Un contre exemple pour l'année 2017
le 01 Janvier 2017 : Année du Singe
le 01 Février 2017 : Année du Coq

Tu es obligé de tenir compte du jour et du mois dans ton code
Micoute a écrit :en dormant m'est venue la solution de cette équation,
Dors en rêvant à autres chose :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Astrologie chinoise

Message par Ollivier »

Micoute a écrit :mais l'idée d'Ollivier m'a interloqué
Je me demande si ce n'est pas le calcul " - 700" qui t'a perturbé.

Pour t'expliquer comment j'ai fait ma ligne de code :

1) j'ai d'abord vérifié ta liste des 12 bêtes. Google m'a dirigé vers le site "Chine nouvelle" qui permet une vérification à l'année près. En gros, un animal, une année, selon un cycle de 12 ans.

2) Comme dit "Falsam", je me suis dit que j'allais utiliser le modulo. C'est intéressant de savoir qu'on a deux calculs possibles :

a) calcul pour entiers : a = b % c
b) calcul pour réels : a = mod(b, c)

sachant que le modulo "3" de 0, 1, 2, 3, 4, 5, etc...
c'est 0, 1, 2, 0, 1, 2, etc...

3) Il me restait à savoir quand ça commence parce qu'admettons que je mette 2000, si tu es né avant 2000, pas sûr que le calcul se fasse proprement. Alors, j'ai regardé le 1er animal de la liste et je me suis dit "A quelle année proche il correspond" puis j'ai soustrait par paquet de 12 jusqu'à un chiffre arrondi : d'où le 700.




Maintenant, peut-être avant de rajouter le bois, le métal, tout ça, peut-être devrait-on se focaliser sur la précision de la date du nouvel an chinois?

Falsam nous a fourni une base de données, pour vérifier.
On sait (enfin, moi je découvre sur le site "Chine nouvelle") qu'une année chinoise débute la deuxième nouvelle Lune après le solstice d'Hiver.

C'est intéressant ça, car ça signifie que c'est un calcul faisable, et pas très important.

Le modulo c'est un rythme. On appelle ça "périodique". C'est un signal "triangle" pour préciser.
Mais ce qui nous importe surtout c'est de savoir qu'un rythme a une période et une phase.

Ainsi les jours durent une journée et commencent le matin.

la journée c'est la période du jour (sens général)
et le matin c'est la phase du jour (sens général).

Il nous faut donc trouver la période lunaire. (en s'inspirant de Copernic par exemple)

Et il nous faut trouver la phase lunaire. (en cherchant dans un almanach spécialisé, il suffit d'en trouver une, à la seconde près)

a) La période lunaire va nous permettre de quantifier l'évenement (on souhaite la deuxième nouvelle lune).

b) La phase lunaire va nous permettre de trouver toutes les nouvelles lune.

c) Enfin, détail : le solstice d'Hiver. Alors, lui ne va pas nous poser de problème. Seulement, cerner un problème, nécessite une mesure de ce que l'on va faire, pour ne pas négliger ce que l'on n'envisageait pas de faire. (expression copyright, parceque mon cerveau a bouillu pour vous la pondre).

Ce que l'on va faire, c'est prendre une année comme un rond-point, rentrer par le solstice, surveiller une phase deux fois, et obtenir une date.

Ce que l'on envisageait pas de faire, c'est parcourir le restant du rond-point pour que l'algo "compte" les années et calcule le modulo. Or, la chance inouïe que l'on a c'est que ce forum regorge de calendriers qui mesure l'exacte durée d'une année donnée.

Conclusion : 3 lignes de code de plus, et on connaît parfaitement le nouvel an chinois!
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Astrologie chinoise

Message par Micoute »

Re grand merci à tous les deux,

@falsam pour l'instant mon équation est bonne pour la majeure d'une année, mais avec le dernier programme que tu as posté, je vais pouvais affiné le résultat, car il suffit d'une seule condition pour que le résultat son le bon au jour près.

@Ollivier je n'aurai pas de problème pour trouver le jour de la deuxième nouvelle lune après le solstice d'hiver grâce au travail de LSI sur ce sujet, c'est dire si j'ai de bons atouts pour achever ce programme où j'adjoindrai les signes zodiacaux qu'on utilisent dans nos contrées.

En tous cas, je remercie le ciel d'avoir intéressé les bonnes personnes pour m'aider, c'est pourquoi je vous remercie encore.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Astrologie chinoise

Message par Micoute »

Voici l'excellent travail de LSI sur les phases de la lune au cas où ...

Code : Tout sélectionner

Structure Structure_PhaseLune
	Phase.b
	Date.i
	An.i
	Mois.b
	Jour.b
	Heure.b
	Minute.b
EndStructure

Global NewList PhaseLune.Structure_PhaseLune()
Global.SYSTEMTIME DateUTC, DateLocale
Global alpha.d
Global Calcul_An, Calcul_Mois, Calcul_Jour

Procedure Calculer_PhaseLune(Annee_, Mois_)
	Static Calculer_PhaseLune_Annee.i, Calculer_PhaseLune_Mois.b
	Protected.i Date, i, ii, Heure, Minute, Mois, An, Jour, JJ
	Protected.d K, T, T2, T3, J, M, MP, F
	
	If  Annee_ <> Calculer_PhaseLune_Annee Or Mois_ <> Calculer_PhaseLune_Mois
		Calculer_PhaseLune_Annee = Annee_
		Calculer_PhaseLune_Mois = Mois_
		
		ClearList(PhaseLune())
		
		Repeat
			GetSystemTime_(DateUTC.SYSTEMTIME)
			GetLocalTime_(DateLocale.SYSTEMTIME)
		Until DateUTC\wSecond = DateLocale\wSecond ; Garantit que la lecture de la date s'est effectuée sur la même seconde
		
		Protected DateUTC_Seconde.q = Date(DateUTC\wYear, DateUTC\wMonth, DateUTC\wDay, DateUTC\wHour, DateUTC\wMinute, DateUTC\wSecond)
		Protected DateLocale_Seconde.q = Date(DateLocale\wYear, DateLocale\wMonth, DateLocale\wDay, DateLocale\wHour, DateLocale\wMinute, DateLocale\wSecond)		
		Protected DecalageHoraire_Seconde.q = DateLocale_Seconde - DateUTC_Seconde
		
		Date = Date(Annee_, Mois_, 1, 0, 0, 0)
		Date = AddDate(Date, #PB_Date_Month, -1)
		K.d = Year(Date)
		Select Month(Date)
			Case 1
				K + 0.041
			Case 2
				K + 0.126
			Case 3
				K + 0.203
			Case 4
				K + 0.288
			Case 5
				K + 0.370
			Case 6
				K + 0.455
			Case 7
				K + 0.537
			Case 8
				K + 0.622
			Case 9
				K + 0.707
			Case 10
				K + 0.789
			Case 11
				K + 0.874
			Case 12
				K + 0.956
		EndSelect
		K = (K - 1900) * 12.3685
		K = Int(K) - 0.25
		If K < 0
			K - 1
		EndIf
		
		For ii = 0 To 11
			
			K + 0.25
			T.d = K / 1236.85
			T2.d = T * T
			T3.d = T * T2
			J.d = 2415020.75933 + 29.5305888531 * K + 0.0001337 * T2 - 0.000000150 * T3 + 0.00033 * Sin((166.56 + 132.87 * T - 0.009 * T2) * #PI / 180)
			M.d = (359.2242 + 29.10535608 * K - 0.0000333 * T2 - 0.00000347 * T3) * #PI / 180
			M = M - Int(M / (2 * #PI)) * (2 * #PI)
			MP.d = (306.0253 + 385.81691806 * K + 0.0107306 * T2 + 0.00001236 * T3) * #PI / 180
			MP = MP - Int(MP / (2 * #PI)) * (2 * #PI)
			F.d = (21.2964 + 390.67050646 * K - 0.0016528 * T2 - 0.00000239 * T3) * #PI / 180
			F = F - Int(F / (2 * #PI)) * (2 * #PI)
			
			i = ii % 4
			If i = 0 Or i = 2
				J + (0.1734 - 0.000393 * T) * Sin(M)
				J + 0.0021 * Sin(2 * M) - 0.4068 * Sin(MP)
				J + 0.0161 * Sin(2 * MP) - 0.0004 * Sin(3 * MP)
				J + 0.0104 * Sin(2 * F) - 0.0051 * Sin(M + MP)
				J - 0.0074 * Sin(M - MP) + 0.0004 * Sin(2 * F + M)
				J - 0.0004 * Sin(2 * F - M) - 0.0006 * Sin(2 * F + MP)
				J + 0.001 * Sin(2 * F - MP) + 0.0005 * Sin(M + 2 * MP)
			Else
				J + (0.1721 - 0.0004 * T) * Sin(M)
				J + 0.0021 * Sin(2 * M) - 0.6280 * Sin(MP)
				J + 0.0089 * Sin(2 * MP) - 0.0004 * Sin(3 * MP)
				J + 0.0079 * Sin(2 * F) - 0.0119 * Sin(M + MP)
				J - 0.0047 * Sin(M - MP) + 0.0003 * Sin(2 * F + M)
				J - 0.0004 * Sin(2 * F - M) - 0.0006 * Sin(2 * F + MP)
				J + 0.0021 * Sin(2 * F - MP) + 0.0003 * Sin(M + 2 * MP)
				J + 0.0004 * Sin(M - 2 * MP) - 0.0003 * Sin(2 * M + MP)
				If i = 1
					J + 0.0028 - 0.0004 * Cos(M)
					J + 0.0003 * Cos(MP)
				Else
					J - 0.0028 + 0.0004 * Cos(M)
					J - 0.0003 * Cos(MP)
				EndIf
			EndIf
			
			J + 0.5
			JJ = Int(j-1)
			If JJ >= 2299160.5
				Alpha.d = Int((JJ - 1867216.25) / 36524.25)
				JJ = JJ + 1 + Alpha - Int(Alpha / 4)
			EndIf
			JJ + 1524
			Calcul_An = Int((JJ - 122.1) / 365.25)
			Calcul_Jour = Int(Calcul_An * 365.25)
			Calcul_Mois = Int((JJ - Calcul_Jour) / 30.6001)
			Jour = Int(JJ - Calcul_Jour - Int(Calcul_Mois * 30.6001))
			If Calcul_Mois < 13.5
				Mois = Int(Calcul_Mois - 1)
			Else
				Mois = Int(Calcul_Mois - 13)
			EndIf
			If Mois >= 3
				An = Int(Calcul_An - 4716)
			Else
				An = Int(Calcul_An - 4715)
			EndIf
			J - Int(j-1)
			Heure = Int(J * 24)
			Minute = Int((J - Heure / 24) * 1440)
			
			AddElement(PhaseLune())
			PhaseLune()\Phase = i
			PhaseLune()\Date = Date(An, Mois, Jour, 0, 0, 0) + (Heure * 3600 + Minute * 60) + DecalageHoraire_Seconde
			PhaseLune()\An = Year(PhaseLune()\Date)
			PhaseLune()\Mois = Month(PhaseLune()\Date)
			PhaseLune()\Jour = Day(PhaseLune()\Date)
			PhaseLune()\Heure = Hour(PhaseLune()\Date)
			PhaseLune()\Minute = Minute(PhaseLune()\Date)
		Next
		
	EndIf
EndProcedure

Procedure ObtenirPhaseLune(Annee_, Mois_, Jour_) ; Obtenir la phase de la lune
	Calculer_PhaseLune(Annee_, Mois_)
	Protected Phase = -1
	ForEach PhaseLune()
		If Annee_ = PhaseLune()\An And Mois_ = PhaseLune()\Mois And Jour_ = PhaseLune()\Jour
			Phase = PhaseLune()\Phase
			Break
		EndIf
	Next
	ProcedureReturn Phase
EndProcedure

Procedure ObtenirHeurePhaseLune(Annee_, Mois_, Jour_) ; Obtenir l'heure de la phase de la lune
	Calculer_PhaseLune(Annee_, Mois_)
	Protected Heure = -1
	ForEach PhaseLune()
		If Annee_ = PhaseLune()\An And Mois_ = PhaseLune()\Mois And Jour_ = PhaseLune()\Jour
			Heure = PhaseLune()\Heure
			Break
		EndIf
	Next
	ProcedureReturn Heure
EndProcedure

Procedure ObtenirMinutePhaseLune(Annee_, Mois_, Jour_) ; Obtenir la minute de la phase de la lune
	Calculer_PhaseLune(Annee_, Mois_)
	Protected Minute = -1
	ForEach PhaseLune()
		If Annee_ = PhaseLune()\An And Mois_ = PhaseLune()\Mois And Jour_ = PhaseLune()\Jour
			Minute = PhaseLune()\Minute
			Break
		EndIf
	Next
	ProcedureReturn Minute
EndProcedure

Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre