Calculo de las fases de la luna

Descripción general

En este documento contiene una clase escrita en Visual Basic.NET que contiene las formulas que permiten calcular con precisión astronómica las fases de la luna en una fecha determinada.

[TOC] Tabla de Contenidos


↑↑↑

Calculo de las fases de la luna


↑↑↑

Introducción

Las funciones que se muestran están traducidas de el programa [Moontool for Windows] escrito por John Walker en Diciembre de 1987. Y son de dominio público

Referencias Web:

El código original está escrito en C Estándar, y en ese lenguaje lo normal es que las funciones reciban una serie de datos por parámetro y devuelvan los resultados también por parámetro, utilizando punteros. Al traducir las funciones a Visual Basic, he respetado ese comportamiento, devolviendo los valores a través de parámetro calificados como [ByRef]

Las funciones que contiene la clase podemos clasificarlas como funciones auxiliares (calificadas con el modificador de acceso Private) que trabajan todas para la función que podemos considerar principal) [Phase]. (Calificada como Public)

''' <summary>
'''     Calcular las fases de la luna como una fracción:
''' </summary>
''' <param name="pdate"> Fecha de cálculo juliana astronómica</param>
''' <param name="pphase">Porcentaje Iluminado de la luna en porcentaje</param>
''' <param name="mage">  Edad de la luna en días</param>
''' <param name="dist">  Distancia de la luna del centro de la tierra en Km</param>
''' <param name="angdia">Diámetro angular de la luna</param>
''' <param name="sudist">Distancia al sol</param>
''' <param name="suangdia">Diámetro angular del sol</param>
''' <returns> 
'''    Devuelve el ángulo de fase de terminación como 
'''    un porcentaje de un círculo completo
''' </returns>
Public Shared Function Phase( _
                           ByVal pdate As Decimal, _
                           ByRef pphase As Decimal, _
                           ByRef mage As Decimal, _
                           ByRef dist As Decimal, _
                           ByRef angdia As Decimal, _
                           ByRef sudist As Decimal, _
                           ByRef suangdia As Decimal) _
                       As Decimal

Esta función recibe la fecha de cálculo en formato de fecha juliana astronómica y devuelve el ángulo de fase de terminación como un porcentaje de un círculo completo (es decir, de 0 a 1). También devuelve por parámetro la fracción iluminada del disco de la Luna, la edad de la Luna en días y fracción, la distancia de la Luna desde el centro de la Tierra, y el diámetro angular de la Luna vista por un observador en el centro de la Tierra.

La otra función que realiza un trabajo es

''' <summary>
'''  Localiza las fases de la luna que rodean a la fecha actual (Juliana)
''' </summary>
''' <param name="sdate">Fecha Juliana</param>
''' <returns>una matriz con los datos</returns>
''' <remarks>
'''   Encuentra las fechas de las fases de la luna que rodean la fecha actual. 
'''   Se devuelve en una matriz cinco fechas julianas astronómicas que
'''   corresponden a la luna nueva, cuarto creciente, luna llena, 
'''   cuarto menguante, y siguiente luna nueva
'''</remarks>
Public Shared Function PhaseHunt(ByVal sdate As Decimal) As Decimal()

Que se encarga de calcular las fases de la luna más cercanas a la fecha de trabajo (en formato Juliana astronómica) pasada por parámetro. Devuelve una matriz que contiene cinco fechas julianas que corresponde a la luna nueva (anterior a la fecha de trabajo), el cuarto creciente, la luna llena, el cuarto menguante y la próxima luna llena.


↑↑↑

Código de la clase

'
'
'
'--------------------------------------------------
' Clase ....: CalculosFasesLuna
' Lenguaje .: (.NET Framework 4-0) - Visual Basic .NET (Version 9.0) - 2010
' Autor ....:  - Aguila - Joaquin
' Emilio ...: mailto:joaquin@medina.name
'
' DESCRIPCION.:
'     Clase escrita en Visual Basic.NET que contiene las formulas que permiten 
'     calcular con precisión astronómica las fases de la luna en una fecha determinada.

' OBSERVACIONES.:
'
'     Las funciones que se muestran están traducidas de el programa 
'     [Moontool for Windows] escrito por John Walker en Diciembre de 1987.  
'     Y son de dominio público
'
'     Referencias Web:
'      ** http://www.fourmilab.ch/
'      ** http://www.fourmilab.ch/moontoolw/
'
'     El código original está escrito en C Estándar, y en ese lenguaje lo 
'     normal es que las funciones reciban una serie de datos por parámetro 
'     y devuelvan los resultados también por parámetro, utilizando punteros. 
'     Al traducir las funciones a Visual Basic, he respetado ese comportamiento, 
'     devolviendo los valores a través de parámetro calificados como [ByRef]
'
'     Las funciones que contiene la clase podemos clasificarlas como 
'     funciones auxiliares (calificadas con el modificador de acceso Private) 
'     que trabajan todas para la función que podemos considerar principal) 
'     [Phase]. (Calificada como Public)
'
'     Los nombres de las funciones originales se han adaptado al 
'     sistema CamelCase usado por Microsoft, pero mantienen su nombre original
'
' BIBLIOGRAFIA.:
'  "Practical Astronomy With Your Calculator" by Peter Duffett-Smith
'  "Astronomical Formulae  for  Calculators"  by  Jean  Meeus
'  "Planetary  Programs  and  Tables  from  -4000 to +2800" 
'     by Pierre Bretagnon and Jean-Louis Simon, Willmann-Bell, 1986.
'  "Celestial BASIC" by Eric Burgess, Revised Edition,  Sybex,  1985.
'
'
' MODIFICACIONES [aaaa-mm-dd  h:m:s] 
' - 2010-09-16  0:00:57 - Creación 
' -------------------------------------------------
'
'*/
'
' -------------------------------------------------
Option Explicit On '    Se deben declarar explícitamente todas las variables mediante 
'                       instrucciones Dim o ReDim. Si intenta usar un nombre de variable 
'                       no declarada, se producirá un error en tiempo de compilación.
Option Strict On   '    No se permiten las conversiones implicitas de datos,  
'                       deben realizarse explictamente (mediante el objeto Convert)
Option Infer Off '      No se permite la inferencia automatica del tipo de variables
Option Compare Binary ' Declara el método de comparación predeterminado que utilizar  
'                       al comparar los datos de cadena. 
'                       Se producirán comparaciones de cadenas basadas en un criterio  
'                       de ordenación que se deriva de las representaciones binarias  
'                       internas de los caracteres.
'                       Este tipo de comparación es especialmente útil si las cadenas  
'                       pueden contener caracteres que no serán interpretados como texto. 
'                       En este caso, no se desea afectar a las comparaciones con  
'                       equivalencias alfabéticas, como la distinción entre  
'                       mayúsculas y minúsculas
'


''' <summary>
''' <para>Contiene las formulas que permiten calcular con precisión 
'''       astronómica las fases de la luna en una fecha determinada.</para>
''' </summary>
''' <remarks>
''' <para>Funciones matematicas para el calculo de las fases de la luna</para>
''' <para>Las funciones que se muestran están traducidas de el programa 
'''       [Moontool for Windows] escrito por John Walker en Diciembre de 1987.
'''       Y son de dominio público</para>
'''
''' <para>El código original está escrito en C Estándar, y en ese lenguaje 
'''       lo normal es que las funciones reciban una serie de datos por 
'''       parámetro y devuelvan los resultados también por parámetro, 
'''       utilizando punteros. Al traducir las funciones a Visual Basic, 
'''       he respetado ese comportamiento, devolviendo los valores a 
'''       través de parámetro calificados como [ByRef]</para>
'''
''' <para>Las funciones que contiene la clase podemos clasificarlas como 
'''       funciones auxiliares (calificadas con el modificador de acceso Private) 
'''       que trabajan todas para la función que podemos considerar principal)
'''       [Phase]. (Calificada como Public)</para>
''' <autor> John Walker en Diciembre de 1987</autor>
''' <traductor> Joaquin medina Serrano: joaquin@medina.name</traductor>
''' <rights>Dominio público</rights>
''' <code>
''' <para>                              Moontool for Windows </para>
''' <para>                              Release 2.0</para>
''' <para>    Designed and implemented by John Walker in December 1987.</para>
''' <para>    Revised and updated in July of 1989 by Ron Hitchens.</para>
''' <para>    Converted to Microsoft Windows in January of 1992 by John Walker.</para>
''' <para>    Convert to Win32 in March of 1999 by John Walker.</para>
'''
''' <para>    The  algorithms used in this program to calculate the positions of</para>
''' <para>    the Sun and Moon as seen from the Earth  are  given  in  the  book</para>
''' <para>    "Practical Astronomy With Your Calculator" by Peter Duffett-Smith,</para>
''' <para>    Second Edition, Cambridge University Press, 1981.  Ignore the word</para>
''' <para>    "Calculator"  in  the  title;  this  is  an essential reference if</para>
''' <para>    you're  interested  in  developing   software   which   calculates</para>
''' <para>    planetary  positions,  orbits,  eclipses, and the like.  If you're</para>
''' <para>    interested in pursuing such programming, you should  also  obtain:</para>
'''
''' <para>    "Astronomical Formulae  for  Calculators"  by  Jean  Meeus,  Third</para>
''' <para>    Edition, Willmann-Bell, 1985.  A must-have.</para>
'''
''' <para>    "Planetary  Programs  and  Tables  from  -4000 to +2800" by Pierre</para>
''' <para>    Bretagnon and Jean-Louis Simon, Willmann-Bell, 1986.  If you  want</para>
''' <para>    the  utmost  (outside of JPL) accuracy for the planets, it's here.</para>
'''
''' <para>    "Celestial BASIC" by Eric Burgess, Revised Edition,  Sybex,  1985.</para>
''' <para>    Very cookbook oriented, and many of the algorithms are hard to dig</para>
''' <para>    out of the turgid BASIC code, but you'll probably want it anyway.</para>
'''
''' <para>    Many  of these references can be obtained from Willmann-Bell, P.O.</para>
''' <para>    Box 35025, Richmond, VA 23235, USA.  Phone:  (804)  320-7016.   In</para>
''' <para>    addition  to  their  own  publications,  they  stock  most  of the</para>
''' <para>    standard references for mathematical and positional astronomy.</para>
'''
''' <para>    This program was written by:</para>
''' <para>        John Walker</para>
''' <para>        http://www.fourmilab.ch/ </para>
''' <para>        http://www.fourmilab.ch/moontoolw/ </para>
'''
''' <para>    This  program is in the public domain: "Do what thou wilt shall be</para>"
''' <para>    the whole of the law".  I'd appreciate  receiving  any  bug  fixes</para>"
''' <para>    and/or  enhancements, which I'll incorporate in future versions of</para>
''' <para>    the program.  Please leave the  original  attribution  information</para>
''' <para>    intact so that credit and blame may be properly apportioned.</para>
'''
''' <para>        History:</para>
''' <para>        --------</para>
''' <para>        June 1988       Version 2.0 for the Sun workstation posted</para>
''' <para>                        to usenet by John Walker</para>
'''
''' <para>        June 1988       Modified by Ron Hitchens</para>
'''
''' <para>        July 1989       Modified a little bit more to use an accurate</para>
''' <para>                        grey-scale moon face created by Joe Hitchens</para>
''' <para>                        on an Amiga.</para>
''' <para>                        Added The Apollo 11 Commemorative Red Dot, to show</para>
''' <para>                        where Neil and Buzz went on vacation 20 years ago.</para>
'''
''' <para>        March 1992      Moontool for Windows 1.0 implemented by John Walker.</para>
'''
''' <para>        April 1992      Bug fix update 1.01 correcting problems reported by</para>
''' <para>                        Michael Geary.</para>
'''
''' <para>        March 1999      Win32 version, reverting to standard Julian Day</para>
''' <para>                        definition after ill-conceived flirtation with "civil</para>"
''' <para>                       Julian Day" beginning at midnight.  Release 2.0.</para>"
'''
''' <para>     Septiembre 2010   La parte correspondiente a los calculos astronomicos</para>
''' <para>                       ha sido traducida a Visual Basic .NET (Version 2010) </para>
''' <para>                       (.NET Framework 4.0) por Joaquin Medina Serrano</para>
''' <para>                       mailto:joaquin@medina.name </para>
''' </code>
''' </remarks>
Public NotInheritable Class CalculosFasesLuna

#Region "Calculos matematicos"

#Region "Documentacion de los calculos"

    '
    '
    '                          Moontool for Windows
    '                               Release 2.0
    '
    '    Designed and implemented by John Walker in December 1987.
    '    Revised and updated in July of 1989 by Ron Hitchens.
    '    Converted to Microsoft Windows in January of 1992 by John Walker.
    '    Convert to Win32 in March of 1999 by John Walker.
    '
    '    The  algorithms used in this program to calculate the positions of
    '    the Sun and Moon as seen from the Earth  are  given  in  the  book
    '    "Practical Astronomy With Your Calculator" by Peter Duffett-Smith,
    '    Second Edition, Cambridge University Press, 1981.  Ignore the word
    '    "Calculator"  in  the  title;  this  is  an essential reference if
    '    you're  interested  in  developing   software   which   calculates
    '    planetary  positions,  orbits,  eclipses, and the like.  If you're
    '    interested in pursuing such programming, you should  also  obtain:
    '
    '    "Astronomical Formulae  for  Calculators"  by  Jean  Meeus,  Third
    '    Edition, Willmann-Bell, 1985.  A must-have.
    '
    '    "Planetary  Programs  and  Tables  from  -4000 to +2800" by Pierre
    '    Bretagnon and Jean-Louis Simon, Willmann-Bell, 1986.  If you  want
    '    the  utmost  (outside of JPL) accuracy for the planets, it's here.
    '
    '    "Celestial BASIC" by Eric Burgess, Revised Edition,  Sybex,  1985.
    '    Very cookbook oriented, and many of the algorithms are hard to dig
    '    out of the turgid BASIC code, but you'll probably want it anyway.
    '
    '    Many  of these references can be obtained from Willmann-Bell, P.O.
    '    Box 35025, Richmond, VA 23235, USA.  Phone:  (804)  320-7016.   In
    '    addition  to  their  own  publications,  they  stock  most  of the
    '    standard references for mathematical and positional astronomy.
    '
    '    This program was written by:
    '
    '        John Walker
    '        http://www.fourmilab.ch/
    '       http://www.fourmilab.ch/moontoolw/
    '
    '    This  program is in the public domain: "Do what thou wilt shall be"
    '    the whole of the law".  I'd appreciate  receiving  any  bug  fixes"
    '    and/or  enhancements, which I'll incorporate in future versions of
    '    the program.  Please leave the  original  attribution  information
    '    intact so that credit and blame may be properly apportioned.
    '
    '        History:
    '        --------
    '        June 1988       Version 2.0 for the Sun workstation posted
    '                        to usenet by John Walker
    '
    '        June 1988       Modified by Ron Hitchens
    '
    '        July 1989       Modified a little bit more to use an accurate
    '                        grey-scale moon face created by Joe Hitchens
    '                        on an Amiga.
    '                        Added The Apollo 11 Commemorative Red Dot, to show
    '                        where Neil and Buzz went on vacation 20 years ago.
    '
    '        March 1992      Moontool for Windows 1.0 implemented by John Walker.
    '
    '        April 1992      Bug fix update 1.01 correcting problems reported by
    '                        Michael Geary.
    '
    '        March 1999        Win32 version, reverting to standard Julian Day
    '                        definition after ill-conceived flirtation with "civil"
    '                        Julian Day" beginning at midnight.  Release 2.0."
    '
    '     Septiembre 2010   La parte correspondiente a los calculos astronomicos
    '                       ha sido traducida a Visual Basic .NET (Version 2010) 
    '                       (.NET Framework 4.0) por Joaquin Medina Serrano
    '                       mailto:joaquin@medina.name
    '
    '*/


#End Region


    '------------------------------------------------------------------
    '

    Private Const epoch As Decimal = 2444238.5D       ' 
    '-----------------------------------------------------------------
    '
    Private Const elonge As Decimal = 278.83354D     ' 
    Private Const elongp As Decimal = 282.596403D    ' 
    Private Const eccent As Decimal = 0.016718D      ' 
    Private Const sunsmax As Decimal = 149598500D    ' 
    Private Const sunangsiz As Decimal = 0.533128D   ' 
    '
    '-----------------------------------------------------------------
    '
    Private Const mmlong As Decimal = 64.975464D      ' 
    Private Const mmlongp As Decimal = 349.383063D    ' 
    Private Const mlnode As Decimal = 151.950429D     ' 
    Private Const minc As Decimal = 5.145396D         ' 
    Private Const mecc As Decimal = 0.0549D           ' 
    Private Const mangsiz As Decimal = 0.5181D        ' 
    Private Const msmax As Decimal = 384401D          ' 
    Private Const mparallax As Decimal = 0.9507D      ' 
    Private Const synmonth As Decimal = 29.53058868D  ' 
    Private Const lunatbase As Decimal = 2423436D     ' 
    '-----------------------------------------------------------------
    Private Const earthrad As Decimal = 6378.16D      ' 
    Private Const PI As Decimal = 3.1415926535897931D ' 
    Private Const EPSILON As Decimal = 0.000001D      ' 
    '-----------------------------------------------------------------

    ' *** Código añadido por el traductor *** 
    Private Sub New()
        ' Regla FxCop
        ' http://msdn.microsoft.com/library/ms182169(VS.90).aspx
        ' El constructor no es necesario puesto que al llamar a los miembros estáticos 
        ' no se requiere una instancia del tipo. Además, como el tipo tiene 
        ' miembros no estáticos, al crear una instancia, no se proporciona 
        ' acceso a cualquiera de los miembros del tipo. 
    End Sub


    '-----------------------------------------------------------------
    ' Funciones matematicas 
    '-----------------------------------------------------------------
    '#define fixangle(a) ((a) - 360.0 * (floor((a) / 360.0)))  
    Private Shared Function Fixangle(ByVal a As Decimal) As Decimal
        Return Convert.ToDecimal(a - 360.0 * (Math.Floor(a / 360.0)))
    End Function

    Private Shared Function Torad(ByVal d As Decimal) As Decimal
        Return Convert.ToDecimal(d * (PI / 180.0))  '   
    End Function

    '#define todeg(d) ((d) * (180.0 / PI))                     
    Private Shared Function Todeg(ByVal d As Decimal) As Decimal
        Return Convert.ToDecimal(d * (180.0 / PI))
    End Function

    '#define dsin(x) (sin(torad((x))))                         
    Private Shared Function Dsin(ByVal x As Decimal) As Decimal
        Return Convert.ToDecimal(Math.Sin(Torad(x)))
    End Function

    '#define dcos(x) (cos(torad((x))))                         
    Private Shared Function Dcos(ByVal x As Decimal) As Decimal
        Return Convert.ToDecimal(Math.Cos(Torad(x)))
    End Function

    '--------------------------------------------------------------------------------------
    '  JYEAR  --  Convert    Julian    date  to  year,  month, day, which are
    '              returned via integer pointers to integers
    Private Shared Sub Jyear( _
                     ByVal td As Decimal, _
                     ByRef yy As Integer, ByRef mm As Integer, ByRef dd As Integer)

        Dim z As Decimal = Decimal.Zero
        Dim f As Decimal = Decimal.Zero
        Dim a As Decimal = Decimal.Zero
        Dim alpha As Decimal = Decimal.Zero
        Dim b As Decimal = Decimal.Zero
        Dim c As Decimal = Decimal.Zero
        Dim d As Decimal = Decimal.Zero
        Dim e As Decimal = Decimal.Zero

        td += 0.5D
        z = Math.Floor(td)
        f = td - z

        If z < 2299161.0 Then
            a = z
        Else
            alpha = Convert.ToDecimal(Math.Floor((z - 1867216.25) / 36524.25))
            a = z + 1 + alpha - Math.Floor(alpha / 4)
        End If

        b = a + 1524
        c = Convert.ToDecimal(Math.Floor((b - 122.1) / 365.25))
        d = Convert.ToDecimal(Math.Floor(365.25 * c))
        e = Convert.ToDecimal(Math.Floor((b - d) / 30.6001))

        dd = Convert.ToInt32(Math.Truncate(b - d - Math.Floor(30.6001 * e) + f))
        mm = Convert.ToInt32(Math.Truncate(If((e < 14), (e - 1), (e - 13))))
        yy = Convert.ToInt32(Math.Truncate(If((mm > 2), (c - 4716), (c - 4715))))
    End Sub

    '  MEANPHASE  --  Calculates  time  of  the mean new Moon for a given
    '                 base date.  This argument K to this function is the
    '                 precomputed synodic month index, given by:
    '                         K = (year - 1900) * 12.3685
    '                 where year is expressed as a year and fractional year.  
    Private Shared Function MeanPhase(ByVal sdate As Decimal, ByVal k As Decimal) As Decimal
        Dim t As Decimal = Decimal.Zero
        Dim t2 As Decimal = Decimal.Zero
        Dim t3 As Decimal = Decimal.Zero
        Dim nt1 As Decimal = Decimal.Zero

         ' Time in Julian centuries from 1900 January 0.5 
        t = Convert.ToDecimal((sdate - 2415020.0) / 36525)
        t2 = t * t
        ' Square for frequent use 
        t3 = t2 * t
        ' Cube for frequent use 

        nt1 = Convert.ToDecimal((2415020.75933 + synmonth * k) _
            + (0.0001178 * t2) _
            - (0.000000155 * t3) _
            + (0.00033 * Dsin(Convert.ToDecimal(166.56 + 132.87 * t - 0.009173 * t2))))
        Return nt1
    End Function

    '  TRUEPHASE  --  Given a K value used to determine the mean phase of
    '                   the new moon, and a phase selector (0.0, 0.25, 0.5,
    '                   0.75), obtain the true, corrected phase time.  
    Private Shared Function TruePhase(ByVal k As Decimal, ByVal phase As Decimal) As Decimal

        Dim t As Decimal = Decimal.Zero
        Dim t2 As Decimal = Decimal.Zero
        Dim t3 As Decimal = Decimal.Zero
        Dim pt As Decimal = Decimal.Zero
        Dim m As Decimal = Decimal.Zero
        Dim mprime As Decimal = Decimal.Zero
        Dim f As Decimal = Decimal.Zero

        k += phase
        ' Add phase to new moon time 
        t = k / 1236.85D
        ' Time in Julian centuries from
        '                                         1900 January 0.5 
        t2 = t * t
        ' Square for frequent use 
        t3 = t2 * t
        ' Cube for frequent use 
        ' Mean time of phase 
        pt = Convert.ToDecimal(2415020.75933 _
            + synmonth * k _
            + 0.0001178 * t2 _
            - 0.000000155 * t3 _
            + 0.00033 * Dsin(Convert.ToDecimal(166.56 + 132.87 * t - 0.009173 * t2)))

        ' Sun's mean anomaly 
        m = Convert.ToDecimal(359.2242 _
            + 29.10535608 * k _
            - 0.0000333 * t2 _
            - 0.00000347 * t3)
        ' Moon's mean anomaly 
        mprime = Convert.ToDecimal(306.0253 _
            + 385.81691806 * k _
            + 0.0107306 * t2 _
            + 0.00001236 * t3)
        ' Moon's argument of latitude 
        f = Convert.ToDecimal(21.2964 _
            + 390.67050646 * k _
            - 0.0016528 * t2 _
            - 0.00000239 * t3)
        If (phase < 0.01) OrElse (Math.Abs(phase - 0.5) < 0.01) Then

            ' Corrections for New and Full Moon 
            pt = Convert.ToDecimal(pt + ((0.1734 - 0.000393 * t) * Dsin(m) _
                 + 0.0021 * Dsin(2 * m) _
                 - 0.4068 * Dsin(mprime) _
                 + 0.0161 * Dsin(2 * mprime) _
                 - 0.0004 * Dsin(3 * mprime) _
                 + 0.0104 * Dsin(2 * f) _
                 - 0.0051 * Dsin(m + mprime) _
                 - 0.0074 * Dsin(m - mprime) _
                 + 0.0004 * Dsin(2 * f + m) _
                 - 0.0004 * Dsin(2 * f - m) _
                 - 0.0006 * Dsin(2 * f + mprime) _
                 + 0.001 * Dsin(2 * f - mprime) _
                 + 0.0005 * Dsin(m + 2 * mprime)))
        ElseIf (Math.Abs(phase - 0.25) < 0.01 OrElse (Math.Abs(phase - 0.75) < 0.01)) Then
            pt = Convert.ToDecimal(pt + ((0.1721 - 0.0004 * t) * Dsin(m) _
                 + 0.0021 * Dsin(2 * m) _
                 - 0.628 * Dsin(mprime) _
                 + 0.0089 * Dsin(2 * mprime) _
                 - 0.0004 * Dsin(3 * mprime) _
                 + 0.0079 * Dsin(2 * f) _
                 - 0.0119 * Dsin(m + mprime) _
                 - 0.0047 * Dsin(m - mprime) _
                 + 0.0003 * Dsin(2 * f + m) _
                 - 0.0004 * Dsin(2 * f - m) _
                 - 0.0006 * Dsin(2 * f + mprime) _
                 + 0.0021 * Dsin(2 * f - mprime) _
                 + 0.0003 * Dsin(m + 2 * mprime) _
                 + 0.0004 * Dsin(m - 2 * mprime) _
                 - 0.0003 * Dsin(2 * m + mprime)))
            If phase < 0.5 Then
                ' First quarter correction 
                pt = Convert.ToDecimal(pt + (0.0028 - 0.0004 * Dcos(m) _
                    + 0.0003 * Dcos(mprime)))
            Else
                ' Last quarter correction 
                pt = Convert.ToDecimal(pt + (-0.0028 + 0.0004 * Dcos(m) _
                     - 0.0003 * Dcos(mprime)))
            End If
        End If
        Return pt
    End Function

    ''
    '' Find time of phases of the moon which surround the
    '' current date. Five phases are found, starting and
    '' ending with the new moons which bound the current
    '' lunation. */

    ' Encuentra las fechas de las fases de la luna que rodean la fecha actual. 
    ' Se devuelve en una matriz cinco fechas julianas astronómicas que corresponden a
    ' la luna nueva mas próxima a la fecha de cálculo, cuarto creciente,
    ' luna llena , cuarto menguante, y siguiente luna nueva
    ''' <summary>
    '''  Localiza las fases de la luna que rodean a la fecha actual (Juliana)
    ''' </summary>
    ''' <param name="sdate">Fecha Juliana</param>
    ''' <returns>una matriz con los datos</returns>
    ''' <remarks>
    '''   Encuentra las fechas de las fases de la luna que rodean la fecha actual. 
    '''   Se devuelve en una matriz cinco fechas julianas astronómicas que
    '''   corresponden a la luna nueva, cuarto creciente, luna llena, 
    '''   cuarto menguante, y siguiente luna nueva
    '''</remarks>
    Public Shared Function PhaseHunt(ByVal sdate As Decimal) As Decimal()

        Dim phases(5) As Decimal

        Dim adate As Decimal = Decimal.Zero
        Dim k1 As Decimal = Decimal.Zero
        Dim k2 As Decimal = Decimal.Zero
        Dim nt1 As Decimal = Decimal.Zero
        Dim nt2 As Decimal = Decimal.Zero
        Dim yy As Integer = 0
        Dim mm As Integer = 0
        Dim dd As Integer = 0

        adate = sdate - 45
        Jyear(adate, yy, mm, dd) ' parametros Byref

        k1 = Convert.ToDecimal(Math.Floor((yy + ((mm - 1) * (1.0 / 12.0)) - 1900) * 12.3685))
        adate = Convert.ToDecimal(nt1 = MeanPhase(adate, k1))
        While True
            adate += synmonth
            k2 = k1 + 1
            nt2 = MeanPhase(adate, k2)
            If nt1 <= sdate AndAlso nt2 > sdate Then
                Exit While ' ----------salida del bucle
            End If
            nt1 = nt2
            k1 = k2
        End While

        phases(0) = TruePhase(k1, 0D)
        phases(1) = TruePhase(k1, 0.25D)
        phases(2) = TruePhase(k1, 0.5D)
        phases(3) = TruePhase(k1, 0.75D)
        phases(4) = TruePhase(k2, 0D)

        Return phases
    End Function

    '  KEPLER  --   Solve the equation of Kepler.  
    Private Shared Function Kepler(ByVal m As Decimal, ByVal ecc As Decimal) As Decimal
        Dim e As Decimal = Decimal.Zero
        Dim delta As Decimal = Decimal.Zero

        m = Torad(m)
        e = m
        Do
            delta = Convert.ToDecimal(e - ecc * Math.Sin(e) - m)
            e = Convert.ToDecimal(e - (delta / (1 - ecc * Math.Cos(e))))
        Loop While Math.Abs(delta) > EPSILON
        Return e

    End Function


    '  PHASE  --  Calculate phase of moon as a fraction:
    '             Calcular las fases de la luna como una fracción:
    '
    '    The  argument  is  the  time  for  which  the  phase is requested,
    '    expressed as a Julian date and fraction.  Returns  the  terminator
    '    phase  angle  as a percentage of a full circle (i.e., 0 to 1), and
    '    stores into pointer arguments  the  illuminated  fraction  of  the
    '    Moon's  disc, the Moon's age in days and fraction, the distance of
    '    the Moon from the centre of the Earth, and  the  angular  diameter
    '    subtended  by the Moon as seen by an observer at the centre of the
    '    Earth.
    '
    '  El argumento es el dia para el que se reliza el calculo expresado como 
    '  fecha juliana astronomica.
    '  Devuelve el ángulo de fase de terminación como un porcentaje de un círculo completo 
    '  (es decir, de 0 a 1), y devuelve a traves de punteros: la fracción 
    '  iluminada del disco de la Luna, la edad de la Luna en días y fracción, 
    '  la distancia de la Luna desde el centro de la Tierra, y el diámetro angular
    '  de la Luna vista por un observador en el centro de la Tierra.
    ''' <summary>
    '''     Calcular las fases de la luna como una fracción:
    ''' </summary>
    ''' <param name="pdate"> Fecha de cálculo juliana astronómica</param>
    ''' <param name="pphase">Porcentaje Iluminado de la luna en porcentaje</param>
    ''' <param name="mage">Edad de la luna en días</param>
    ''' <param name="dist">Distancia de la luna del centro de la tierra en Km</param>
    ''' <param name="angdia">Diámetro angular de la luna</param>
    ''' <param name="sudist">Distancia al sol</param>
    ''' <param name="suangdia">Diámetro angular del sol</param>
    ''' <returns> 
    ''' Returns  the  terminator phase  angle  as a percentage of a full circle (i.e., 0 to 1)
    ''' Devuelve el ángulo de fase de terminación como un porcentaje de un círculo completo
    ''' </returns>
    Public Shared Function Phase( _
                               ByVal pdate As Decimal, _
                               ByRef pphase As Decimal, _
                               ByRef mage As Decimal, _
                               ByRef dist As Decimal, _
                               ByRef angdia As Decimal, _
                               ByRef sudist As Decimal, _
                               ByRef suangdia As Decimal) _
                           As Decimal

        '---------------------------------------------
        Dim Day As Decimal = Decimal.Zero
        Dim N As Decimal = Decimal.Zero
        Dim M As Decimal = Decimal.Zero
        Dim Ec As Decimal = Decimal.Zero
        Dim Lambdasun As Decimal = Decimal.Zero
        Dim ml As Decimal = Decimal.Zero
        Dim MM As Decimal = Decimal.Zero
        Dim MN As Decimal = Decimal.Zero
        Dim Ev As Decimal = Decimal.Zero
        Dim Ae As Decimal = Decimal.Zero
        Dim A3 As Decimal = Decimal.Zero
        Dim MmP As Decimal = Decimal.Zero
        Dim mEc As Decimal = Decimal.Zero
        Dim A4 As Decimal = Decimal.Zero
        Dim lP As Decimal = Decimal.Zero
        Dim V As Decimal = Decimal.Zero
        Dim lPP As Decimal = Decimal.Zero
        Dim NP As Decimal = Decimal.Zero
        Dim y As Decimal = Decimal.Zero
        Dim x As Decimal = Decimal.Zero
        Dim Lambdamoon As Decimal = Decimal.Zero
        Dim BetaM As Decimal = Decimal.Zero
        Dim MoonAge As Decimal = Decimal.Zero
        Dim MoonPhase As Decimal = Decimal.Zero
        Dim MoonDist As Decimal = Decimal.Zero
        Dim MoonDFrac As Decimal = Decimal.Zero
        Dim MoonAng As Decimal = Decimal.Zero
        Dim MoonPar As Decimal = Decimal.Zero
        Dim F As Decimal = Decimal.Zero
        Dim SunDist As Decimal = Decimal.Zero
        Dim SunAng As Decimal = Decimal.Zero

        ' Calculation of the Sun's position 
        ' Cálculo de la posición del Sol

        Day = pdate - epoch
        ' Date within epoch  Fecha en la época
        N = Fixangle(Convert.ToDecimal((360 / 365.2422) * Day))
        ' Mean anomaly of the Sun  Anomalía media del Sol
        M = Fixangle(N + elonge - elongp)
        ' Convert from perigee co-ordinates to epoch 1980.0 
        'Convertir de perigeo coordenadas a la época 1980.0
        Ec = Kepler(M, eccent)
        ' Solve equation of Kepler  Resolver la ecuación de Kepler
        Ec = Convert.ToDecimal(Math.Sqrt((1 + eccent) / (1 - eccent)) * Math.Tan(Ec / 2))
        Ec = 2 * Todeg(Convert.ToDecimal(Math.Atan(Ec)))
        ' True anomaly 
        Lambdasun = Fixangle(Ec + elongp)
        ' Sun's geocentric ecliptic longitude   geocéntrica de longitud eclíptica del Sol
        ' Orbital distance factor               Orbital factor distancia

        F = Convert.ToDecimal(((1 + eccent * Math.Cos(Torad(Ec))) / (1 - eccent * eccent)))
        SunDist = sunsmax / F
        ' Distance to Sun in km                 Distancia al sol en kilómetros
        SunAng = F * sunangsiz
        ' Sun's angular size in degrees         tamaño angular del Sol en grados

        ' Calculation of the Moon's position    Cálculo de la posición de la Luna
        ' Moon's mean longitude                 longitud media de la Luna
        ml = Fixangle(Convert.ToDecimal(13.1763966 * Day + mmlong))

        ' Moon's mean anomaly                   anomalía  media de la Luna
        MM = Fixangle(Convert.ToDecimal(ml - 0.1114041 * Day - mmlongp))

        ' Moon's ascending node mean longitude  nodo ascendente de la Luna longitud media
        MN = Fixangle(Convert.ToDecimal(mlnode - 0.0529539 * Day))

        ' Evection 
        Ev = Convert.ToDecimal(1.2739 * Math.Sin(Torad(2 * (ml - Lambdasun) - MM)))

        ' Annual equation                       ecuación anual
        Ae = Convert.ToDecimal(0.1858 * Math.Sin(Torad(M)))

        ' Correction term                       Corrección plazo
        A3 = Convert.ToDecimal(0.37 * Math.Sin(Torad(M)))

        ' Corrected anomaly                     Corregido anomalía
        MmP = MM + Ev - Ae - A3

        ' Correction for the equation of the centre  La corrección de la ecuación del centro
        mEc = Convert.ToDecimal(6.2886 * Math.Sin(Torad(MmP)))

        ' Another correction term                Otro término de corrección
        A4 = Convert.ToDecimal(0.214 * Math.Sin(Torad(2 * MmP)))

        ' Corrected longitude                    Corregido de longitud
        lP = ml + Ev + mEc - Ae + A4

        ' Variation 
        V = Convert.ToDecimal(0.6583 * Math.Sin(Torad(2 * (lP - Lambdasun))))

        ' True longitude 
        lPP = lP + V

        ' Corrected longitude of the node 
        NP = Convert.ToDecimal(MN - 0.16 * Math.Sin(Torad(M)))

        ' Y inclination coordinate 
        y = Convert.ToDecimal(Math.Sin(Torad(lPP - NP)) * Math.Cos(Torad(minc)))

        ' X inclination coordinate 
        x = Convert.ToDecimal(Math.Cos(Torad(lPP - NP)))

        ' Ecliptic longitude 
        Lambdamoon = Todeg(Convert.ToDecimal(Math.Atan2(y, x)))
        Lambdamoon += NP

        ' Ecliptic latitude 
        BetaM = Todeg(Convert.ToDecimal(Math.Asin(Math.Sin(Torad(lPP - NP)) * Math.Sin(Torad(minc)))))

        ' Calculation of the phase of the Moon 
        ' Age of the Moon in degrees 
        MoonAge = lPP - Lambdasun

        ' Phase of the Moon 
        MoonPhase = Convert.ToDecimal((1 - Math.Cos(Torad(MoonAge))) / 2)

        ' Calculate distance of moon from the centre of the Earth 
        MoonDist = Convert.ToDecimal((msmax * (1 - mecc * mecc)) / (1 + mecc * Math.Cos(Torad(MmP + mEc))))

        ' Calculate Moon's angular diameter 
        MoonDFrac = MoonDist / msmax
        MoonAng = mangsiz / MoonDFrac

        ' Calculate Moon's parallax 
        MoonPar = mparallax / MoonDFrac



        '-------------------------------------
        ' devolver resultados

        ' Date for which to calculate phase 
        ' Illuminated fraction 
        ' Age of moon in days 
        ' Distance in kilometres 
        ' Angular diameter in degrees 
        ' Distance to Sun 
        ' Sun's angular diameter  

        pphase = MoonPhase
        mage = Convert.ToDecimal(synmonth * (Fixangle(MoonAge) / 360.0))
        dist = MoonDist
        angdia = MoonAng
        sudist = SunDist
        suangdia = SunAng

        Return Convert.ToDecimal(Fixangle(MoonAge) / 360.0)
    End Function


    ' -----------------------------------------------------------------
    ' *** Código añadido por el traductor *** 
    ' -----------------------------------------------------------------
    ''' <summary>
    '''   <para>Calculo de las fases lunares relevantes del mes</para> 
    '''   <para> Localiza las fases IMPORTANTES de la luna que rodean a la fecha actual</para> 
    ''' </summary>
    ''' <param name="jd">Fecha juliana sobre la que se calculan los datos</param>
    ''' <returns>
    '''    <para>Una matriz de cinco (5) elementos con numeros decimales .</para>  
    '''    <para>Cada numero decimal es una fecha juliana</para> 
    '''    <para>El resultado esta en formato juliano</para> 
    '''    <para>Elemento [0] = luna nueva</para> 
    '''    <para>Elemento [1] = cuarto creciente</para> 
    '''    <para>Elemento [2] = luna llena</para> 
    '''    <para>Elemento [3] = cuarto menguante</para> 
    '''    <para>Elemento [4] = proxima luna nueva</para> 
    ''' </returns>
    Public Shared Function CalculoFechasFasesLunares(ByVal jd As Decimal) As Decimal()
        '---------------------------------
        ' El parametro es una fecha en formato juliano
        ' Calculo de las fases lunares relevantes del mes
        ' Localiza las fases IMPORTANTES de la luna que rodean a la fecha actual (Juliana)
        ' El resultado esta en formato juliano
        ' Elemento [0] = luna nueva
        ' Elemento [1] = cuarto creciente
        ' Elemento [2] = luna llena
        ' Elemento [3] = cuarto menguante
        ' Elemento [4] = proxima luna nueva
        '---------------------------------
        Return PhaseHunt(jd + 0.5D)
    End Function


    ' -----------------------------------------------------------------
    ' *** Código añadido por el traductor *** 
    ' -----------------------------------------------------------------
    ''' <summary>
    '''    Es un numero (integer) que representa el numero de la lunacion
    ''' </summary>
    ''' <param name="jd">Fecha juliana sobre la que se calculan los datos</param>
    ''' <returns>numero (integer) que representa el numero de la lunacion</returns>
    Public Shared Function CalculoNumeroLunacion(ByVal jd As Decimal) As Integer
        ' El numero no se de donde sale
        ' Es un numero (integer) que representa el numero de la lunacion
        ' No sé cual es la razon de que empieze a contar a partir de la fecha [1922-11-19T00:06:22Z --> lunacion =0]
        '---------------------------------
        Dim fasesLunaresRelevates As Decimal() = PhaseHunt(jd + 0.5D)
        Return Convert.ToInt32(Math.Floor(((fasesLunaresRelevates(0) + 7 - lunatbase) / synmonth)) + 1)
    End Function

#End Region

End Class


↑↑↑

Ejemplo para control de resultados

 
== Fechas del calculo == 
  Fecha Juliana         :                 2451545,0
  Fecha UTC             :      2000-01-01T12:00:00Z

 == Información sobre la luna == 
                      ┐ :                          
  Edad de la luna     │ :          24,8314545757241
                      | : 24 dias, 19 horas, 57 minutos 
                      ┘ :                          
                      ┐ :                          
  Porcentaje iluminado| :                    0,2298
                      | : 23% [0% nueva, 100% llena]
                      | :            Luna menguante
                      ┘ :                          
                      ┐ :                          
  Distancia al centro | :                400216 Km.
         de la tierra | :      62,75 radios tierra.
                      ┘ :                          
  Diametro angular      :            0,4976 grados.
                        :                          
                      ┐ :                          
  Luna con el Sol:    | :                          
   - Distancia        | :             147099300 Km.
                      | : 0,9833 unidades astronómicas.
   - Diametro angular | :            0,5422 grados.
                      ┘ :                          

 == Información sobre las fases de la luna == 
 Luna nueva             :  2451520,43962525    1999-12-07T22:33:04Z -- Lunacion = 952
 Cuarto creciente       :  2451528,53538194    1999-12-16T00:50:57Z
 luna llena             :  2451535,23134153    1999-12-22T17:33:08Z
 Cuarto menguante       :  2451542,08747989    1999-12-29T14:05:58Z
 Proxima luna nueva     :  2451550,26038623    2000-01-06T18:14:57Z -- Lunacion = 953

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquin Medina Serrano
Ésta página es española