我正在制作一個Javascript程式,其中一個功能是將高度/方位角轉換為給定時間和緯度的赤經/赤緯。我的代碼可以相當準確地找到偏角,我用 Stellarium 進行了檢查。我一直在使用這個網站來幫助我做數學。
我的程式給了我錯誤的水平提升值,我打算用它來找到正確的提升(我已經有一個函式可以找到有效的本地恒星時)。這是我的等式代碼,
var ha = asin(-sin(az)*cos(alt) / cos(dec)) * (180 / Math.PI);該代碼在 Javascript 中,但我定義了自定義 sin/cos/asin 函式,這些函式將度數作為輸入并回傳弧度,因為這是我的資料所在的形式。
我使用的網站還說這個方程應該給出相同的結果
var ha = acos((sin(alt) - sin(lat)*sin(dec)) / (cos(lat) * cos(dec))) * (180 / Math.PI);
,但是,這兩個方程給出了不同的結果,并且根據 stellarium 都不是正確的。我檢查了我輸入的所有變數都是正確的,我幾乎可以肯定我輸入的方程是正確的。這是github上的完整代碼。我需要幫助弄清楚如何解決這個問題。
--注意這可以在沒有庫的節點js上運行我得到的結果是{ ra: [ 23, 57, 37.9 ], dec: [ -5, 24, 38.88 ] }
它應該得到{ ra: [ 5, 36, 22.6 ], dec: [ -5, 24, 38.88 ] 不一定要準確,我只關心 ra 的第一個數字(赤經)。它也被格式化為 HMS 格式。日期時間被硬編碼為 Febuary 1st 2022 12:00:00 所以這是你應該設定的stellarium to 如果你正在測驗這個。
這是相關代碼
function altazToradec(alt, az, lat, lon, time){
/*
right ascension (α)
declination (δ)
altitude (a)
azimuth (A)
siderial time (ST)
latitude (φ) (Φ)
*/
var lst = getLST(time, lon);
var dec = asin(sin(lat)*sin(alt) cos(lat)*cos(alt)*cos(az)) * (180 / Math.PI);
var ha = asin(sin(az)*cos(alt) / cos(dec)) * (180 / Math.PI);//acos((sin(alt) - sin(lat)*sin(dec)) * (sec(lat) * sec(dec))) * (180 / Math.PI);//acos((sin(alt) - sin(lat)*sin(dec)) / (cos(lat)*cos(dec))) * (180 / Math.PI);
var ra = lst - ha;
console.log(ha)
return {
"ra": ra,
"dec": dec
}
}
這里還有一些測驗用例
console.log(altazToradecHms(-34.6825, 63.7814, 40.5853, -105.0844, new Date('February 1, 2022 12:00:00').getTime()))// Ft. Collins Co M42 Orion nebula Feb 1st 2022 12:00 noon
console.log(altazToradecHms(-34.6825, 63.7814, 41.875, -87.624, new Date('January 1, 2022 08:00:00').getTime()))//Chicago M42 Orion nebula Jan 1st 2022 8:00 AM
console.log(altazToradecHms(301.7678, 64.41758, 51.49, -0.14, new Date('February 1, 2020 12:00:00').getTime()))//London Eta Cas Feb 1st 2020 12:00 noon
回傳
{ ra: [ 23, 57, 37.9 ], dec: [ -5, 24, 38.88 ] }
{ ra: [ 19, 4, 59.25 ], dec: [ -6, 16, 33.68 ] }
{ ra: [ 5, 59, 37.02 ], dec: [ -31, 34, 55.6 ] }
代替
{ ra: [ 5, 36, 22.7], dec: [ -5, 22, 44 ] }
{ ra: [ 5, 36, 22.7 ], dec: [ -5, 22, 40.3 ] }
{ ra: [ 0, 50, 25.7 ], dec: [ 57, 56, 4.7 ] }
注意:我已經檢查過了,我也相信 getLST() 函式有效,我已經檢查過了。謝謝 - CR。
uj5u.com熱心網友回復:
試試下面的。顯著的變化包括:
在建立 J2000.0 日期時指定“GMT 0000”,除了傳遞給
altazToradec(). 否則, new Date() 回傳本地時間。源自MathWorks.com的“DEC”和“HA”計算(在“函式”選項卡下查看)。
注意:“HA”和“RA”以度為單位,而不是小時。要轉換為小時,請乘以(24 小時/360 度),或簡單地除以(15 度/小時)。
來自StarGazing.net的樣本資料。
function deg2rad( x ) { return x * Math.PI / 180 };
function rad2deg( x ) { return x * 180 / Math.PI };
function sinDeg( x ) {
return Math.sin( deg2rad( x ) );
}
function cosDeg( x ) {
return Math.cos( deg2rad( x ) );
}
function asinDeg( x ) {
return rad2deg( Math.asin( x ) );
}
function atan2Deg( y, x ) {
return rad2deg( Math.atan2( y, x ) );
}
// getLST copied from https://github.com/Blank2275/AstroCoordsJS/blob/master/index.js
// and then tweaked.
function getLST(time, lon){
//time = new Date(time)
const J2000Date = new Date('January 1, 2000 12:00:00 GMT 0000').getTime();
const diff = time - J2000Date;
const d = diff / (1000 * 60 * 60 * 24);
var hours = time.getUTCHours();
var minutes = time.getUTCMinutes();
var seconds = time.getUTCSeconds();
var ms = time.getUTCSeconds();
var utc = (hours * (1000 * 60 * 60) minutes * (1000 * 60) seconds * 1000 ms) / (1000 * 60 * 60 * 24) * 360;//(now.getTime() - beginning.getTime()) / (1000 * 60 * 60 * 24) * 360;
var lst = 100.46 (0.985647 * d) lon utc;
if(lst > 360){
while(lst > 360){
lst -= 360;
}
} else if(lst < 0){
while(lst < 0){
lst = 360;
}
}
return lst;
}
// Equations sourced from https://www.mathworks.com/matlabcentral/fileexchange/24581-convert-azimuth-and-elevation-to-right-ascension-and-declination
function altazToradec( alt, az, lat, lon, time ){
/*
right ascension (α)
declination (δ)
altitude (a)
azimuth (A)
siderial time (ST)
latitude (φ) (Φ)
*/
var lst = getLST( time, lon );
var dec = asinDeg( sinDeg( alt ) * sinDeg( lat ) cosDeg( alt ) * cosDeg( lat ) * cosDeg( az ) );
var ha = atan2Deg(
-sinDeg( az ) * cosDeg( alt ) / cosDeg( dec ),
( sinDeg( alt ) - sinDeg( dec ) * sinDeg( lat ) ) / ( cosDeg( dec ) * cosDeg( lat ) )
);
var ra = ( lst - ha ) % 360;
return {
"ha": ha,
"ra": ra,
"dec": dec
}
}
// See example from http://www.stargazing.net/kepler/altaz.html#twig04
console.log( 'Input: ALT = 49.169122, AZ = 269.14634, LAT = 52.5, LON = 0, Date = 2310 UT on 10th Aug 1998' );
console.log( 'Expected Output: HA = 54.382617, DEC = 36.466667' );
x = altazToradec( 49.169122, 269.14634, 52.5, 0, new Date('August 10, 1998 23:10:00 GMT 0000') );
console.log( x );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/424843.html
標籤:javascript 数学 坐标系 天文学
