Попытка написать несколько математиков из Википедии в 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);