【问题标题】:Bug with astronomical coordinate conversion天文坐标转换的错误
【发布时间】: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


    【解决方案1】:

    我认为问题在于声明

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

    在函数equHor() 中。 atan2 的结果是以弧度表示的角度。您可能不会使用 360 对其进行标准化。

    【讨论】:

    • 就是这样!嗯,那,和正常化两次。谢谢!
    • 在我看来,您可能会在修复 A 问题后放弃第二次标准化(这只是试图在错误的地方解决问题)。
    • 完全正确 - 我刚刚删除了它,并在下面的标准化之前转换为度数:az: norm(A * co.rtd, 360)
    【解决方案2】:

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

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

    我只是想知道你能不能确认一下。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 2015-09-23
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多