Помогите с формулой для притяжения одного тела к другому(статичному). 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>" + "&nbsp;&nbsp;&nbsp;&nbsp;вдоль оси ординат: " + (100*moveble.vy).toFixed(2) + " км/с&nbsp;&nbsp;&nbsp;&nbsp;вдоль оси абсцисс: " + (100*moveble.vx).toFixed(2) + " км/с<br>Ускорение спутника: " + a.toFixed(2) + " км/с";
            timer = window.performance.now();
        }
    }, 20);
}
<body style="padding: 0; margin: 0;">
</body>

P.S. если нужна отрисовка траектории, закомментируйте строки под строками удаление предыдущего положения "спутника" и отрисовка "планеты"

→ Ссылка