Помогите с формулой для притяжения одного тела к другому(статичному). 2D
x1, y1 - позиция статичной планеты. m1 - масса статичной планеты.
x2, y2 - позиция подвижной планеты. m2 - масса подвижной планеты.
Как мне используя эти данные раcсчитать, на сколько по x и y сдвинется подвижная планета? Помогите пожалуйста.
Ответы (1 шт):
Автор решения: Вася Воронцов
→ Ссылка
Конечно, не идеал (очень приближённая траектория + для космический масс и расстояний не хватает экрана, однако можно организовать собственную систему физических единиц), но всё же:
window.onload = function() {
init();
}
function init() {
//блок с информацией
let info = document.createElement("div");
info.style.cssText = "position: absolute; left: 0; top: 0;";
document.body.appendChild(info);
//переходим к холсту
let quality = 2;
let canvas = document.createElement("canvas");
let context = canvas.getContext("2d");
//высота и ширина Canvas
let width = quality * 1000;
let height = quality * 1000;
canvas.width = width;
canvas.height = height;
//добавляем холст на страницу
document.body.appendChild(canvas);
//массы, начальные координаты и скорости объектов
//масса в 10^24 кг
//расстояния в 10^5 м = 100 км
//скорости в 10^5 м/с = 100 км/с
let moveble = {m: 1, x: 300, y: 100, vx: 0.0228, vy: 0};
let unmoveble = {m: 20, x: 300, y: 300};
//подготовка к рисованию
context.clearRect(0, 0, width, height);
//отрисовка "планеты"
context.fillRect(unmoveble.x-1, unmoveble.y-1, 2, 2);
//гравитационная постоянная 10^(-11)
let G = 6.67;
//промежутки между состояниями, чем меньше - тем точнее, в секундах
let dt = 10;
//таймер :)
let timer = window.performance.now();
setInterval(function() {
//rx, ry - координаты вектора расстояния между "спутником" и "планетой"
let rx = moveble.x - unmoveble.x;
let ry = moveble.y - unmoveble.y;
//квадрат расстояния
let d = rx*rx + ry*ry;
//расстояние
let r = Math.sqrt(d);
//ускорение в 10^3 м/с = 1 км/с
let a = G * unmoveble.m / d;
//изменение скорости
moveble.vx -= 0.5*(a*dt)*rx/r/100;
moveble.vy -= 0.5*(a*dt)*ry/r/100;
//ry/r - проекция на ось ординат
//rx/r - проекция на ось абсцисс
//деление на 100 приводит км/с к 100 км/с
//изменение координат
moveble.x += moveble.vx*dt;
moveble.y += moveble.vy*dt;
//!!! именно это Вы и искали
//удаление предыдущего положения "спутника"
context.clearRect(0, 0, quality*1000, quality*1000);
//отрисовка "планеты"
context.fillRect(unmoveble.x-2, unmoveble.y-2, 4, 4);
//отрисовка спутника
context.fillRect(moveble.x-1, moveble.y-1, 2, 2);
//визуализация ускорения
context.strokeStyle = "#0f0";
context.beginPath();
context.moveTo(moveble.x, moveble.y);
context.lineTo(moveble.x - rx*10*a, moveble.y - ry*10*a);
context.stroke();
//визуализация скорости
context.strokeStyle = "#f0f";
context.beginPath();
context.moveTo(moveble.x, moveble.y);
context.lineTo(moveble.x+moveble.vx*400, moveble.y+moveble.vy*400);
context.stroke();
//вывод необходимых значений через каждую секунду
if (window.performance.now() - timer > 1000) {
info.innerHTML = "Расстояние между объектами: " + (100*r).toFixed(2) + " км<br>Скорость спутника: " + (100*Math.sqrt(moveble.vx*moveble.vx+moveble.vy*moveble.vy)).toFixed(2) + " км/с<br>" + " вдоль оси ординат: " + (100*moveble.vy).toFixed(2) + " км/с вдоль оси абсцисс: " + (100*moveble.vx).toFixed(2) + " км/с<br>Ускорение спутника: " + a.toFixed(2) + " км/с";
timer = window.performance.now();
}
}, 20);
}
<body style="padding: 0; margin: 0;">
</body>
P.S. если нужна отрисовка траектории, закомментируйте строки под строками удаление предыдущего положения "спутника" и отрисовка "планеты"