Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/ControlsDemo.Wpf/Modules/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WPF/VB/ControlsDemo.Wpf/Modules/MoonCalculator.vb

Imports Microsoft.VisualBasic
Imports System

Namespace ControlsDemo
	Public NotInheritable Class MoonCalculator
		Private Shared arc As Double = 206264.8062
		Private Sub New()
		End Sub
		Private Shared Function Frac(ByVal x As Double) As Double
			x = x - Math.Floor(x)
			Return If(x < 0, x + 1, x)
		End Function
		Private Shared Function CalculateSun(ByVal t As Double) As Double
			Dim m As Double = Math.PI * 2 * Frac(0.993133 + 99.997361 * t)
			Dim dl As Double = 6893.0 * Math.Sin(m) + 72.0 * Math.Sin(2 * m)
			Dim l As Double = Math.PI * 2 * Frac(0.7859453 + m / 2 / Math.PI + (6191.2 * t + dl) / 1296E3)
			Return l * 180 / Math.PI
		End Function
		Private Shared Sub CalculateMoon(ByVal t As Double, <System.Runtime.InteropServices.Out()> ByRef l As Double, <System.Runtime.InteropServices.Out()> ByRef b As Double)
			Dim l0 As Double = Frac(0.606433 + 1336.855225 * t)
			Dim p2 As Double = Math.PI * 2
			l = p2 * Frac(0.374897 + 1325.552410 * t)
			Dim ls As Double = p2 * Frac(0.993133 + 99.997361 * t)
			Dim d As Double = p2 * Frac(0.827361 + 1236.853086 * t)
			Dim f As Double = p2 * Frac(0.259086 + 1342.227825 * t)
			Dim dl As Double = +22640 * Math.Sin(l) - 4586 * Math.Sin(l - 2 * d) + 2370 * Math.Sin(2 * d) + 769 * Math.Sin(2 * l) - 668 * Math.Sin(ls) - 412 * Math.Sin(2 * f) - 212 * Math.Sin(2 * l - 2 * d) - 206 * Math.Sin(l + ls - 2 * d) + 192 * Math.Sin(l + 2 * d) - 165 * Math.Sin(ls - 2 * d) - 125 * Math.Sin(d) - 110 * Math.Sin(l + ls) + 148 * Math.Sin(l - ls) - 55 * Math.Sin(2 * f - 2 * d)
			Dim s As Double = f + (dl + 412 * Math.Sin(2 * f) + 541 * Math.Sin(ls)) / arc
			Dim h As Double = f - 2 * d
			Dim n As Double = -526 * Math.Sin(h) + 44 * Math.Sin(l + h) - 31 * Math.Sin(-l + h) - 23 * Math.Sin(ls + h) + 11 * Math.Sin(-ls + h) - 25 * Math.Sin(-2 * l + f) + 21 * Math.Sin(-l + f)
			l = p2 * Frac(l0 + dl / 1296E3)
			l = l * 180.0 / Math.PI
			b = (18520.0 * Math.Sin(s) + n) / arc
			b = b * 180.0 / Math.PI

		End Sub
		Public Shared Function GetPhase(ByVal currentDate As DateTime) As Double
			Dim t As Double = (currentDate.Subtract(New DateTime(2000, 1, 1))).Duration().TotalDays / 36525
			Dim ls As Double = CalculateSun(t)
			Dim l, b As Double
			CalculateMoon(t, l, b)
			Dim cgam As Double = Math.Cos((ls - l) * Math.PI / 180) * Math.Cos(b * Math.PI / 180)
			Dim sgam As Double = Math.Sqrt(1.0 - cgam * cgam)
			Dim s As Double = Math.Atan2(sgam, (0.0025 - cgam)) * 180.0 / Math.PI
			t = ls - l
			t = If(t < 0, t + 360, t)
			If t < 180 Then
				Return -Math.Pow(Math.Cos(s / 2 * Math.PI / 180), 2)
			End If
			Return Math.Pow(Math.Cos(s / 2 * Math.PI / 180), 2)
		End Function
	End Class
End Namespace