Skip to content

Код движения Луны

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>
Clone this wiki locally