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.
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.
' ' ' '-------------------------------------------------- ' 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
== 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
© 1997 - - La Güeb de Joaquín | |||||
Joaquin Medina Serrano
|
|||||
|