gpt4 book ai didi

javascript - 尝试用 Javascript 编写一些来自维基百科的数学(太阳位置计算)

转载 作者:行者123 更新时间:2023-12-03 10:14:57 24 4
gpt4 key购买 nike

我正在尝试为 Threejs 项目估算太阳在 XYZ 中的位置。

我正在遵循此处找到的数学:http://en.wikipedia.org/wiki/Position_of_the_Sun

根据上述内容,我编写了以下 Javascript 代码:

    var n = ((2440587.5 + (this.datemillis / 8.64E7)) - 2451545);
var L = 280.460 + 0.9856474 * n;
var g = 357.528 + 0.9856003 * n;
L = (L + 360) % 360;
g = (g + 360) % 60;
var lambda = L + 1.915 * Math.sin(g) + 0.0020 * Math.sin(2 * g);
var r = 1.00014 - 0.01671 * Math.cos(g) - 0.00014 * Math.cos(2 * g);
var e = 23.439 - 0.0000004 * n;

var x = (r * this.constants.EARTH_RADIUS * 2) * Math.cos(lambda);
var y = (r * this.constants.EARTH_RADIUS * 2) * Math.cos(e) * Math.sin(lambda);
var z = (r * this.constants.EARTH_RADIUS * 2) * Math.sin(e) * Math.sin(lambda);

this.datemillis 由 Javascript 日期对象的 getMillisecond 函数返回。每帧更新一次,时间每 2 秒前进约 1 小时。

但是,某些内容一定不正确,因为这不会产生预期的结果。当我在 Threejs 项目中将计算出的 x y z 坐标应用于太阳时,我可以看到太阳绕地球旋转(位于 0,0,0),但速度非常慢(在几天内旋转地球,而不是 24小时)。

我认为这可能与我没有正确执行的 Angular 计算有关(度/弧度?),但我不太擅长数学,所以我真的不知道我在做什么这样做也许是我误解了 Wiki 的计算。

如果有人能发现我做错的明显事情并帮助我解决这个问题,我将不胜感激!

谢谢

编辑:所以我的太阳目前并没有以连续的方式绕地球旋转 - 它交替顺时针/逆时针旋转,有时会跳跃位置......

最佳答案

我建议这样做来获取朱利安日期,来自 Calculating Jday(Julian Day) in javascript

var today = Date();
var JD = Math.floor((today / 86400000) - (today.getTimezoneOffset()/1440) + 2440587.5);

向 JD 添加所需的天数,并以所需的速度增加该值。请注意,如果每毫秒添加 1 天,您将得到每秒 1000 天,而不是每 2 秒 1 小时。

JD += offset;

然后继续维基百科的食谱:

var n = JD - 2451545;

//...

要将 Lg 放在 0-360 范围内(这里有一个错误),请使用

L = L % 360 + ( L < 0 ? 360 : 0 );
g = g % 360 + ( g < 0 ? 360 : 0 );

维基百科公式以度数表示 Angular 。然而 JavaScript 三 Angular 函数 cossin 需要弧度。

只需写出它们的“度”版本:

function cosD( deg ) {
return Math.cos( deg * Math.PI / 180.0 );
}

function sinD( deg ) {
return Math.sin( deg * Math.PI / 180.0 );
}

然后在后续计算中使用sinD()cosD()

var r = 1.00014 - 0.01671 * cosD(g) - 0.00014 * cosD(2 * g);
var e = 23.439 - 0.0000004 * n;

var x = (r * this.constants.EARTH_RADIUS * 2) * cosD(lambda);
var y = (r * this.constants.EARTH_RADIUS * 2) * cosD(e) * sinD(lambda);
var z = (r * this.constants.EARTH_RADIUS * 2) * sinD(e) * sinD(lambda);

关于javascript - 尝试用 Javascript 编写一些来自维基百科的数学(太阳位置计算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29930416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com