Autore Topic: Calcolare le fasi lunari  (Letto 388 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.725
  • Ne mors quidem nos iunget
    • Mostra profilo
« Ultima modifica: 07 Febbraio 2022, 14:19:09 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.239
  • Tonno verde
    • Mostra profilo
Re:Calcolare le fasi lunari
« Risposta #1 il: 20 Settembre 2017, 18:09:30 »
Ammesso e non concesso che quanto qui scritto corrisponda al vero, sulla base di questo documento ho tirato giù un codice che sembra funzionare rispetto alla tabella:
Codice: [Seleziona]
' Gambas module file

Public Sub Main()

  Dim d As Date
  Dim s As String
  Dim i As Integer

  s = "27/1/2013"
  d = Date(Val(s))
  i = GiornoFase(d)
  Print "Giorno fase: "; i,
  If i = 0 Then
    Print "Luna nuova"
  Else If i < 15 Then
    Print "Luna crescente"
  Else If i = 15 Then
    Print "Luna piena"
  Else If i > 15 Then
    Print "Luna calante"
  Endif

End

Public Function GiornoFase(value As Date) As Integer

  Dim giorno, mese, anno, fase As Integer

  giorno = Day(value)
  mese = Month(value)
  anno = Year(value)
  If mese = 1 Or If mese = 2 Then anno -= 1
  fase = giorno + capomese(mese) + epatta(anno) + 1
  If fase > 30 Then fase -= 30
  Print "Capomese: "; capomese(mese), "Epatta: "; epatta(anno)
  Return fase

End

Public Function capomese(mese As Integer) As Integer

  Dim cc As Integer[] = [11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  Return cc[mese - 1]

End

Public Function epatta(anno As Integer) As Integer

  Dim cc As Integer[] = [0, 11, 22, 3, 14, 25, 6, 17, 28, 9, 20, 1, 12, 23, 4, 15, 26, 7, 18, 9, 10, 21, 2, 13, 24, 5, 16, 27, 8, 19]
  Dim dd As Integer[] = [19, 8, 27, 16, 5, 24, 13, 2, 21, 10, 9, 18, 7, 26, 15, 4, 23, 12, 1, 20, 9, 28, 17, 6, 25, 14, 3, 22, 11, 0]
  Dim resto, valore As Integer

  If anno = 2006 Then Return 0
  If anno > 2006 Then
    valore = anno - 2006
    If valore > 30 Then
      resto = valore Mod 30
      Return cc[resto]
    Else
      Return cc[valore]
    Endif
  Else
    valore = 2005 - anno
    If valore > 30 Then
      resto = valore Mod 30
      Return dd[resto]
    Else
      Return dd[valore]
    Endif
  Endif

End
Si basa sul fatto che, sempre in base a questo documento e più precisamente alla tabella dell'epatta, ho notato che si ripete costante di trent'anni in trent'anni la stessa sequenza.
Da li l'idea di creare due vettori uno  "in avanti" l'altro al contrario "indietro" per calcolare l'epatta a partire da un anno zero.
Temo che sia troppo bello per essere vero ma che questo codice possa fare da base se qualcuno sa realmente come si calcolano le fasi lunari.
Io non ho trovato nulla che sia per me commestibile (tipo quello citato).

 :ciao: :ciao:

P.s. Vorrei spiegarmi meglio, ho capito che c'è un numero aureo che serve per apportare correzioni (ogni 19 anni?) ma non ho compreso come le apporta e dove trovare qualcosa in tal senso.
Se la sequenza fosse solo da correggere con l'apporto di tale numero, anche il codice proposto forse potrebbe funzionare.  :-\
« Ultima modifica: 20 Settembre 2017, 19:55:06 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro