作为一个更大项目的一部分,我正在开发一个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
我也很担心 - 似乎在地平线上仍然应该有一个均匀,平滑的分布(即使它不是线性的),但似乎并非如此。
答案 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);
我只是想知道你是否可以证实这一点。