【发布时间】:2014-06-29 20:52:45
【问题描述】:
作为一个更大项目的一部分,我正在开发一个 JavaScript 库,它将帮助我为几乎任何你想要的东西生成星历表。我正在做的当前工作是坐标转换。作为一个测试项目,我正在为给定的时间和地点生成黄道上的度数列表(即经度 34,纬度 0)及其对应的水平方位角。我遇到的问题是,在中间,在黄道 155 度和 334 度之间,所有方位角都跳到 20000 范围内。怎么了?
HTML 脚本:
function main() {
var i, e, h, op;
var olon = -121.46888;
var olat = 38.55556;
var jd = julian(1971,3,21,6,38,0);
var ecl = getNuta(jd).ecl;
op = "Equinoctal Az by Ecl Degree<br><br>"
for (i = 0; i < 360; i++) {
e = eclEqu(i, 0, ecl);
h = equHor(e.ra, e.dec, olat, lst(jd, olon));
op += "Ecl: " + i + " = Hor: " + h.az.toFixed(3) + "<br>"
}
document.write( op);
}
以及转换函数:
function eclEqu(lambda, beta, ecl) {
// Converts ecliptic to equatorial
// -> 3x float in degrees
// <- {ra:, dec:} 2x float in hours, degrees
var l, b, e, a, d, up, dn;
l = lambda * co.dtr;
b = beta * co.dtr;
e = ecl * co.dtr;
up = Math.sin(l) * Math.cos(e) - Math.tan(b) * Math.sin(e);
dn = Math.cos(l);
a = Math.atan2(up,dn);
d = Math.asin(Math.sin(b) * Math.cos(e)
+ Math.cos(b) * Math.sin(e) * Math.sin(l));
return {ra: a * co.rth, dec: d * co.rtd};
}
function equHor(alpha, delta, phi, lst) {
// Converts equatorial to horizontal
// -> 4x float, in hrs, deg, deg (obs. lat), and hrs
// <- {az:, alt:} 2x float in deg
var d, p, ha, A, h, up, dn;
d = delta * co.dtr;
p = phi * co.dtr;
ha = (lst - alpha) * co.htr;
up = Math.sin(ha);
dn = Math.cos(ha) * Math.sin(p) - Math.tan(d) * Math.cos(p);
A = norm(Math.atan2(up, dn), 360);
h = Math.asin(Math.sin(p) * Math.sin(d)
+ Math.cos(p) * Math.cos(d) * Math.cos(ha));
return {az: A * co.rtd, alt: h * co.rtd};
}
norm 是一个简单的函数,它通过加/减 x 的倍数直到在范围内,将一个数字归一化为 0 到 x(以上大多数情况下为 360)的范围:
norm(n, x) = n - ( x * int(n/x))
我将norm 应用到每个输出,这有帮助,但我仍然得到这些疯狂的跳跃:
Ecl: 153 = Hor: 2.537
Ecl: 154 = Hor: 0.557
Ecl: 155 = Hor: 105.103
Ecl: 156 = Hor: 103.214
和
Ecl: 333 = Hor: 289.018
Ecl: 334 = Hor: 287.038
Ecl: 335 = Hor: 178.622
Ecl: 336 = Hor: 176.734
我也担心 - 似乎在地平线周围仍然应该有一个均匀、平滑的分布(即使它不是线性的),但情况似乎并非如此。
【问题讨论】:
标签: javascript coordinate-transformation astronomy