-
Notifications
You must be signed in to change notification settings - Fork 0
Код движения Луны
Alexander Petrichkovich edited this page Aug 5, 2017
·
10 revisions
Всё, что ниже скопировать и сохранить в файл moon.html. После этого открыть файл в браузере. Лень загружать сюда готовым файлом, поэтому сделал вики-страничку :)
Для моделирования движения планет использовал простые формулы из курса школьной физики: F = G m1 m2 / r^2 и F = m a
Луна на странице рисуется красным цветом.
Выводы: Движение Луны всё-таки можно описать законами физики, в данном конкретном случае научного заговора нет и никто не корректирует её движение специально! Представьте сколько энергии пришлось бы затрачивать изменяя траекторию такого огромного небесного объекта! А как на счёт остальных спутников? У Юпитера их вообще 69! Где взять столько энергии, чтоб изменять траекторию каждого небесного тела?
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Moon</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<canvas id="canvas" width="3200" height="3200"></canvas>
<script>
//sky
var canvas_width = 3200;
var canvas_position = canvas_width / 2 * 0.95;
var c = document.getElementById('canvas');
var ctx = c.getContext('2d');
ctx.fillStyle = '#eee';
ctx.fillRect(0, 0, canvas_width, canvas_width);
ctx.stroke();
//sun
var sun = {
x: 0,
y: 0,
vs: 0,
vh: 0,
m: 1.98892e30 //kg
};
//earth
var earth = {
x: 0,
y: 149600000000, //m
v: [-29783, 0], //m/s
m: 5.97219e24 //kg
};
//moon
var moon = {
x: 0,
y: earth.y + 384400000, //m
v: [earth.v[0] - 1023, 0], //m/s
m: 7.3477e22
};
const G = 6.67408e-11; //м^3·с^(−2)·кг^(−1), или Н·м^2·кг^(−2)
const G_EARTH_M_SUN_M = G * earth.m * sun.m;
const G_MOON_M_SUN_M = G * moon.m * sun.m;
const G_MOON_M_EARTH_M = G * moon.m * earth.m;
//draw sun
ctx.beginPath();
ctx.arc(canvas_width / 2 + sun.x / 150000000000 * canvas_position, canvas_width / 2 - sun.y / 150000000000 * canvas_position, 10, 0, 2 * Math.PI);
ctx.fillStyle = 'orange';
ctx.fill();
//draw earth
ctx.beginPath();
ctx.arc(canvas_width / 2 + earth.x / 150000000000 * canvas_position, canvas_width / 2 - earth.y / 150000000000 * canvas_position, 1, 0, 2 * Math.PI);
ctx.fillStyle = 'blue';
ctx.fill();
//draw moon
ctx.beginPath();
ctx.arc(canvas_width / 2 + moon.x / 150000000000 * canvas_position, canvas_width / 2 - moon.y / 150000000000 * canvas_position, 1, 0, 2 * Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
function startTimer() {
setInterval(function() {
var dt = 60 * 60;
//for (var i = 0; i < 24 * 365; i++) {
//calc earth/sun forces
var earth_sun_dx = Math.abs(earth.x - sun.x);
var earth_sun_dy = Math.abs(earth.y - sun.y);
var earth_sun_r2 = earth_sun_dx * earth_sun_dx + earth_sun_dy * earth_sun_dy;
var earth_sun_r = Math.sqrt(earth_sun_r2);
var earth_sun_forth = G_EARTH_M_SUN_M / earth_sun_r2;
var earth_sun_forth_x = (earth.x - sun.x > 0 ? -1 : 1) * earth_sun_forth * earth_sun_dx / earth_sun_r;
var earth_sun_forth_y = (earth.y - sun.y > 0 ? -1 : 1) * earth_sun_forth * earth_sun_dy / earth_sun_r;
var earth_sun_dsx = earth_sun_forth_x * dt * dt / earth.m /*+ earth.v[0] * dt*/;
var earth_sun_dsy = earth_sun_forth_y * dt * dt / earth.m /*+ earth.v[1] * dt*/;
//calc earth/moon forces
var earth_moon_dx = Math.abs(earth.x - moon.x);
var earth_moon_dy = Math.abs(earth.y - moon.y);
var earth_moon_r2 = earth_moon_dx * earth_moon_dx + earth_moon_dy * earth_moon_dy;
var earth_moon_r = Math.sqrt(earth_moon_r2);
var earth_moon_forth = G_MOON_M_EARTH_M / earth_moon_r2;
var earth_moon_forth_x = (earth.x - moon.x > 0 ? -1 : 1) * earth_moon_forth * earth_moon_dx / earth_moon_r;
var earth_moon_forth_y = (earth.y - moon.y > 0 ? -1 : 1) * earth_moon_forth * earth_moon_dy / earth_moon_r;
var earth_moon_dsx = earth_moon_forth_x * dt * dt / earth.m /*+ earth.v[0] * dt*/;
var earth_moon_dsy = earth_moon_forth_y * dt * dt / earth.m /*+ earth.v[1] * dt*/;
//calc moon/sun forces
var moon_sun_dx = Math.abs(moon.x - sun.x);
var moon_sun_dy = Math.abs(moon.y - sun.y);
var moon_sun_r2 = moon_sun_dx * moon_sun_dx + moon_sun_dy * moon_sun_dy;
var moon_sun_r = Math.sqrt(moon_sun_r2);
var moon_sun_forth = G_MOON_M_SUN_M / moon_sun_r2;
var moon_sun_forth_x = (moon.x - sun.x > 0 ? -1 : 1) * moon_sun_forth * moon_sun_dx / moon_sun_r;
var moon_sun_forth_y = (moon.y - sun.y > 0 ? -1 : 1) * moon_sun_forth * moon_sun_dy / moon_sun_r;
var moon_sun_dsx = moon_sun_forth_x * dt * dt / moon.m /*+ moon.v[0] * dt*/;
var moon_sun_dsy = moon_sun_forth_y * dt * dt / moon.m /*+ moon.v[1] * dt*/;
//calc moon/earth forces
var moon_earth_dx = Math.abs(moon.x - earth.x);
var moon_earth_dy = Math.abs(moon.y - earth.y);
var moon_earth_r2 = moon_earth_dx * moon_earth_dx + moon_earth_dy * moon_earth_dy;
var moon_earth_r = Math.sqrt(moon_earth_r2);
var moon_earth_forth = G_MOON_M_EARTH_M / moon_earth_r2;
var moon_earth_forth_x = (moon.x - earth.x > 0 ? -1 : 1) * moon_earth_forth * moon_earth_dx / moon_earth_r;
var moon_earth_forth_y = (moon.y - earth.y > 0 ? -1 : 1) * moon_earth_forth * moon_earth_dy / moon_earth_r;
var moon_earth_dsx = moon_earth_forth_x * dt * dt / moon.m /*+ moon.v[0] * dt*/;
var moon_earth_dsy = moon_earth_forth_y * dt * dt / moon.m /*+ moon.v[1] * dt*/;
//update mon location
moon.x += moon_sun_dsx + moon_earth_dsx + moon.v[0] * dt;
moon.y += moon_sun_dsy + moon_earth_dsy + moon.v[1] * dt;
//update moon speed
var moon_vx = moon.v[0] + (moon_sun_forth_x + moon_earth_forth_x) * dt / moon.m;
var moon_vy = moon.v[1] + (moon_sun_forth_y + moon_earth_forth_y) * dt / moon.m;
moon.v[0] = moon_vx;
moon.v[1] = moon_vy;
//update earth location
earth.x += earth_sun_dsx + earth_moon_dsx + earth.v[0] * dt;
earth.y += earth_sun_dsy + earth_moon_dsy + earth.v[1] * dt;
//update earth speed
var earth_vx = earth.v[0] + (earth_sun_forth_x + earth_moon_forth_x) * dt / earth.m;
var earth_vy = earth.v[1] + (earth_sun_forth_y + earth_moon_forth_y) * dt / earth.m;
earth.v[0] = earth_vx;
earth.v[1] = earth_vy;
//ctx.fillStyle = '#eee';
//ctx.fillRect(0, 0, canvas_width, canvas_width);
if (!window.i || i == 0 || i % 200000 == 0) {
//draw sun
ctx.beginPath();
ctx.arc(canvas_width / 2 + sun.x / 150000000000 * canvas_position, canvas_width / 2 - sun.y / 150000000000 * canvas_position, 10, 0, 2 * Math.PI);
ctx.fillStyle = 'orange';
ctx.fill();
//draw earth
ctx.beginPath();
ctx.arc(canvas_width / 2 + earth.x / 150000000000 * canvas_position, canvas_width / 2 - earth.y / 150000000000 * canvas_position, 1, 0, 2 * Math.PI);
ctx.fillStyle = 'blue';
ctx.fill();
}
if (!window.i || i == 0 || i % 100000 == 0) {
//draw moon
ctx.beginPath();
ctx.arc(canvas_width / 2 + moon.x / 150000000000 * canvas_position, canvas_width / 2 - moon.y / 150000000000 * canvas_position, 1, 0, 2 * Math.PI);
ctx.fillStyle = 'red';
ctx.fill();
}
//}
}, 1);
}
startTimer();
</script>
</body>
</html>