I am making a Javascript program and on of the functions is to convert altitude/azimuth to right-ascension/declination given a time and latitude. My code can find the declination fairly accurately, I checked with Stellarium. I have been using this site to help me with the math.
My program gives me the wrong value for horizontal ascension which I plan on using to find right ascension (I already have a function to find local sidereal time which works). Here is my code for the equation
var ha = asin(-sin(az)*cos(alt) / cos(dec)) * (180 / Math.PI); this code is in Javascript but I defined custom sin/cos/asin functions that take degrees as input and return radians because that is the form my data is in.
The site I use also says that this equation should give the same result
var ha = acos((sin(alt) - sin(lat)*sin(dec)) / (cos(lat) * cos(dec))) * (180 / Math.PI);
but, the two equations give different results and neither are correct according to stellarium. I have checked that all the variables I am putting in are correct and I am almost certain I entered the equation correct. Here is the full code on github. I need help figuring out how to fix this problem.
--Note this can be run with node js with no libraries
The result I get is { ra: [ 23, 57, 37.9 ], dec: [ -5, 24, 38.88 ] }
It should be getting { ra: [ 5, 36, 22.6 ], dec: [ -5, 24, 38.88 ] it does not have to be exact, I only really care about the first number of ra (right ascension). It is also formatted in HMS format. The datetime is hardcoded to Febuary 1st 2022 12:00:00 so that is what you should set stellarium to if you are testing this out.
Here is the relevant code
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
}
}
Here are some more test cases
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
which returns
{ 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 ] }
instead of
{ 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 ] }
Note: I have checked and I also believe the getLST() function works, I have checked it. Thank you - CR.
CodePudding user response:
Give the following a try. Notable changes include:
Specified 'GMT 0000' when establishing J2000.0 date, in addition to the date being passed in to
altazToradec(). Otherwise, new Date() returns local time.Sourced calculation of 'DEC' and 'HA' from MathWorks.com (look under the "Functions" tab).
NOTE: 'HA' and 'RA' are in degrees, not hours. To convert to hours, multiply by (24 hrs / 360 deg), or simply divide by (15 deg / hr).
Sourced sample data from 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 );
