具有天文坐标转换的Bug

时间:2014-06-29 20:52:46

标签: javascript coordinate-transformation astronomy

作为一个更大项目的一部分,我正在开发一个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

我也很担心 - 似乎在地平线上仍然应该有一个均匀,平滑的分布(即使它不是线性的),但似乎并非如此。

2 个答案:

答案 0 :(得分:1)

我认为问题是声明

A = norm(Math.atan2(up, dn), 360);

在函数equHor()中。 atan2的结果是以弧度表示的角度。你可能不会用360来标准化它。

答案 1 :(得分:0)

我正在开展一个类似的项目,并受到您的解决方案的启发。然后我遇到方位角偏离180°的错误结果,直到我发现我必须将equHor()的公式更改为:

up = Math.sin((alpha - lst) * co.htr);
dn = Math.tan(d) * Math.cos(p) - Math.cos(ha) * Math.sin(p);

我只是想知道你是否可以证实这一点。