Reza_NA
جمعه 17 مهر 1388, 07: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
من دنبال یه مقاله برای تعیین موقعیت خورشید و ماه در آسمان می گشتم که به این مقاله بر خوردم
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