PDA

View Full Version : محاسبه موقعیت اجرام در آسمان



Reza_NA
جمعه 17 مهر 1388, 06:43 صبح
با سلام خدمت دوستان جامعه برنامه نویس

من دنبال یه مقاله برای تعیین موقعیت خورشید و ماه در آسمان می گشتم که به این مقاله بر خوردم
http://www.stjarnhimlen.se/comp/ppcomp.html
و سعی کردم که با استفاده از توضیحاتی که داده یه برنامه بنویسم. ولی به یه مشکل فوق العاده بزرگ برخوردم. متوجه شدم که خروجی کاملا اشتباهه. حتی با وارد کردن زمان جدید تغییر آنچنانی نمی کنه (تقریبا ثابته). می تونم خواهش کنم که راهنماییم کنید.
اینم کد برنامه ای که نوشتم.
وی بی دات نت

Public Class Form1

Const Radeg As Double = 180 / Math.PI

'توابع مثلثاتی برای کار با درجه بجای رادیان

Private Function sind(ByVal x)
Return Math.Sin(x / Radeg)
End Function

Private Function cosd(ByVal x)
Return Math.Cos(x / Radeg)
End Function

Private Function tand(ByVal x)
Return Math.Tan(x / Radeg)
End Function

Private Function asind(ByVal x)
Return Radeg * Math.Atan(x / Math.Sqrt(1 - x * x))
End Function

Private Function acosd(ByVal x)
Return 90 - asind(x)
End Function

Private Function atand(ByVal x)
Return Radeg * Math.Atan(x)
End Function

Private Function atan2d(ByVal y, ByVal x)
Return Radeg * Math.Atan(y / x) - 180 * (x < 0)
End Function

Private Class SunC
'متغییر d محاسبه شده بر اساس فاصله زمانی هم اکنون تا ابتدای سال 2000 میلادی بر حسب روز
Public d As Double = 367 * Date.UtcNow.Year - 7 * (Date.UtcNow.Year + (Date.UtcNow.Month + 9) / 12) / 4 + 275 * Date.UtcNow.Month / 9 + Date.UtcNow.Day - 730530 + (Date.UtcNow.Hour + Date.UtcNow.Minute / 60 + Date.UtcNow.Second / 3600) / 24.0
Public ecl As Double = 23.4393 - 0.0000003563 * d
'Orbital elements of the Sun:
Public N As Double = 0.0
Public i As Double = 0.0
Public w As Double = 282.9404 + 0.0000470935 * d
Public a As Double = 1.0
Public e As Double = 0.016709 - 0.000000001151 * d
Public M As Double = 356.047 + 0.9856002585 * d
End Class

Private Sun As SunC = New SunC

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Randomize(Now.Millisecond)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim E1 As Double = Sun.M + Sun.e * (180 / Math.PI) * sind(Sun.M) * (1.0 + Sun.e * cosd(Sun.M))
Dim xv As Double = cosd(E1) - Sun.e
Dim yv As Double = Math.Sqrt(1.0 - Sun.e * Sun.e) * sind(E1)

Dim v As Double = atan2d(yv, xv)
Dim r As Double = Math.Sqrt(xv * xv + yv * yv)

Dim lonsun As Double = v + Sun.w
Dim xs As Double = r * cosd(lonsun)
Dim ys As Double = r * sind(lonsun)

Dim xe As Double = xs
Dim ye As Double = ys * cosd(Sun.ecl)
Dim ze As Double = ys * sind(Sun.ecl)
Dim RA As Double = atan2d(ye, xe)
Dim Dec As Double = atan2d(ze, Math.Sqrt(xe * xe + ye * ye))
'خروجی باید زاویه جهت تابش خورشید نسبت به شمال (چرخش از شمال به شرق به جنوب به غرب-ساعت گرد) و زاویه ارتفاع تابش برحسب درجه از سطح زمین
t1.Text = RA & vbCrLf & Dec
End Sub

End Class
جاواسکریپت(داخل یک صفحه اچ تی ام ال)




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<title></title>
</head>

<body>

</body>

</html>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">


try{
var pi = Math.PI;
var radeg = 180/pi;

Math.sind = function(x){return Math.sin(x/radeg)}
Math.cosd = function(x){return Math.cos(x/radeg)}
Math.tand = function(x){return Math.tan(x/radeg)}
Math.asind = function(x){return radeg*Math.atan(x/Math.sqrt(1-x*x))}
Math.acosd = function(x){return 90 - Math.asind(x)}
Math.atand = function(x){return radeg*Math.atan(x)}
Math.atan2d = function(y,x){return radeg*Math.atan(y/x) - 180*(x<0)}

var ndate = new Date()
d = 367 * ndate.getUTCFullYear() - 7 * (ndate.getUTCFullYear() + (ndate.getUTCMonth() + 9) / 12) / 4 + 275 * ndate.getUTCMonth() / 9 + ndate.getUTCDate() - 730530
var UT = ndate.getUTCHours() + ndate.getUTCMinutes() / 60 + ndate.getUTCSeconds() / 3600;
d = d + UT/24.0
var ecl = 23.4393 - 3.563E-7 * d;
//Orbital elements of the Sun:
var Sun = {
N : 0.0,
i : 0.0,
w : 282.9404 + 4.70935E-5 * d,
a : 1.000000, //(AU)
e : 0.016709 - 1.151E-9 * d,
M : 356.0470 + 0.9856002585 * d
};

//Orbital elements of the Moon:
var Moon = {
N : 125.1228 - 0.0529538083 * d,
i : 5.1454,
w : 318.0634 + 0.1643573223 * d,
a : 60.2666, //(Earth radii)
e : 0.054900,
M : 115.3654 + 13.0649929509 * d
};
//Orbital elements of Mercury:
var Mercury = {
N : 48.3313 + 3.24587E-5 * d,
i : 7.0047 + 5.00E-8 * d,
w : 29.1241 + 1.01444E-5 * d,
a : 0.387098, //(AU)
e : 0.205635 + 5.59E-10 * d,
M : 168.6562 + 4.0923344368 * d
}
//Orbital elements of Venus:
var Venus = {
N : 76.6799 + 2.46590E-5 * d,
i : 3.3946 + 2.75E-8 * d,
w : 54.8910 + 1.38374E-5 * d,
a : 0.723330, //(AU)
e : 0.006773 - 1.302E-9 * d,
M : 48.0052 + 1.6021302244 * d
}
//Orbital elements of Mars:
var Mars = {
N : 49.5574 + 2.11081E-5 * d,
i : 1.8497 - 1.78E-8 * d,
w : 286.5016 + 2.92961E-5 * d,
a : 1.523688, //(AU)
e : 0.093405 + 2.516E-9 * d,
M : 18.6021 + 0.5240207766 * d
}
//Orbital elements of Jupiter:
var Jupiter = {
N : 100.4542 + 2.76854E-5 * d,
i : 1.3030 - 1.557E-7 * d,
w : 273.8777 + 1.64505E-5 * d,
a : 5.20256, //(AU)
e : 0.048498 + 4.469E-9 * d,
M : 19.8950 + 0.0830853001 * d
}
//Orbital elements of Saturn:
var Saturn = {
N : 113.6634 + 2.38980E-5 * d,
i : 2.4886 - 1.081E-7 * d,
w : 339.3939 + 2.97661E-5 * d,
a : 9.55475, //(AU)
e : 0.055546 - 9.499E-9 * d,
M : 316.9670 + 0.0334442282 * d
}
//Orbital elements of Uranus:
var Uranus = {
N : 74.0005 + 1.3978E-5 * d,
i : 0.7733 + 1.9E-8 * d,
w : 96.6612 + 3.0565E-5 * d,
a : 19.18171 - 1.55E-8 * d, //(AU)
e : 0.047318 + 7.45E-9 * d,
M : 142.5905 + 0.011725806 * d
}
//Orbital elements of Neptune:
var Neptune = {
N : 131.7806 + 3.0173E-5 * d,
i : 1.7700 - 2.55E-7 * d,
w : 272.8461 - 6.027E-6 * d,
a : 30.05826 + 3.313E-8 * d, //(AU)
e : 0.008606 + 2.15E-9 * d,
M : 260.2471 + 0.005995147 * d
}
function sunp(){
E = Sun.M + Sun.e*(180/pi) * Math.sind(Sun.M) * ( 1.0 + Sun.e * Math.cosd(Sun.M) )
xv = Math.cosd(E) - Sun.e
yv = Math.sqrt(1.0 - Sun.e*Sun.e) * Math.sind(E)

v = Math.atan2d( yv, xv )
r = Math.sqrt( xv*xv + yv*yv )

lonsun = v + Sun.w
xs = r * Math.cosd(lonsun)
ys = r * Math.sind(lonsun)

xe = xs
ye = ys * Math.cosd(ecl)
ze = ys * Math.sind(ecl)
RA = Math.atan2d( ye, xe )
Dec = Math.atan2d( ze, Math.sqrt(xe*xe+ye*ye) )
return ['E = '+E+'<br>','xv = '+xv+'<br>','yv = '+yv+'<br>','v = '+v+'<br>','r = '+r+'<br>','lonsun = '+lonsun+'<br>','xs = '+xs+'<br>','ys = '+ys+'<br>','xe = '+xe+'<br>','ye = '+ye+'<br>','ze = '+ze+'<br>','RA = '+RA+'<br>','Dec = '+Dec+'<br>'];
} /**/

document.write(sunp())
}catch(e){
alert(e.description?e.description:e);
}
/*]]>*/
</SCRIPT>
اینم یه سری توضیحات اضافی برای برنامه نویسان که ضمیمه همین مقال هستش
http://stjarnhimlen.se/comp/tutorial.html