Попытка написать несколько математиков из Википедии в Javascript (вычисление положения на солнце)

Я пытаюсь приблизить положение солнца в XYZ для проекта ThreeJS.

Я следую математике, найденной здесь: 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 возвращается функцией getMillisecond объекта даты Javascript. Он обновляется каждый кадр, так что время увеличивается примерно на 1 час каждые 2 секунды.

Однако что-то не должно быть правильным, поскольку это не дает ожидаемого результата. Когда я применяю вычисленные координаты XYZ к своему солнцу в своем проекте ThreeJS, я вижу, что Солнце вращается вокруг Земли (сидит в 0,0,0), но с очень медленной скоростью (вращение Земли за несколько дней вместо 24 часы).

Я думаю, что это может иметь какое-то отношение к вычислениям углов, которые я делаю неправильно (градусы / радианы?), Но я не очень хорош в математике, поэтому я не знаю, что я делаю, может быть, Я просто неверно истолковал расчеты вики.

Если кто-то может заметить что-то очевидное, я делаю что-то не так и помочь мне исправить это, был бы очень признателен!

Спасибо

РЕДАКТИРОВАТЬ: таким образом, мое солнце в настоящее время не вращается вокруг земли непрерывно - оно вращается по часовой стрелке / против часовой стрелки, а иногда прыгает позиции...

2 ответа

Решение

Я не могу ответить на ваш вопрос, но я знаю, что это решенная проблема в три раза. По этой теме в Github приведен пример работы в архитектурно-инженерном процессе на Github. Код положения солнца здесь https://github.com/radio412/viewer/blob/gh-pages/sun-position.js

Вы можете увидеть, что он был включен для направленного света в тройке в строке 108 здесь: https://github.com/radio412/viewer/blob/gh-pages/va3c-viewer.js

Я предлагаю это, чтобы получить юлианскую дату, из расчета Jday(юлианский день) в JavaScript

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

Добавьте к JD желаемое количество дней и увеличьте это значение с желаемой скоростью. Обратите внимание, что если вы добавите 1 день каждую миллисекунду, вы получите 1000 дней в секунду, а не 1 час каждые 2 секунды.

JD += offset;

Тогда продолжайте с рецептом википедии:

var n = JD - 2451545;

 //...

Класть L а также g в диапазоне 0-360 (здесь есть ошибка) используйте

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

Формулы Википедии выражают углы в градусах. Однако тригонометрические функции JavaScript cos а также sin ожидать радианы.

Просто напишите их "градусную" версию:

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);
Другие вопросы по тегам