Разделение компонентов ускорения для орбитального моделирования - PullRequest
0 голосов
/ 26 августа 2018

Я создаю симуляцию из двух тел, где предполагается, что Земля «вращается» вокруг Солнца, однако она движется только по диагональной линии. Я решил, что это потому, что я рассматривал ускорение как скалярную величину и должен был учитывать ее направление.

Я написал еще один код для нахождения вектора от Земли до Солнца и его аргумент, затем попытался найти компоненты x и y ускорения. Однако он все еще не вращается вокруг Солнца, как я ожидал.

Любая помощь будет великолепна.

Вот код (только две соответствующие функции, обратите внимание, что я преобразовал ось холста в декартово множество):

function calAcc (){
    //gravitational constant m3kg-1s-2
    var G = 6.67408E-11;
    //mass of earth kg
    var m2 = 5.972E24;
    //mass of sun kg
    var m1 = 1.989E30;

    var r = (Math.sqrt((Math.pow(xPos,2))+(Math.pow(yPos,2))));
    //calculate the force on the earth using F = Gm1m2/r^2
    //force is towards the centre of the sun
    var F = ((G*m1*m2)/(Math.pow(r,2)));
    //calculate earths acceleration using Newton 2nd a = F / m 
    var aMag = (F/m2);

    var sunPos = [0,0];
    var earthPos = [xPos, yPos];
    var accVec = [];

    //find position vector from earth to sun
    for (var i=0; i<=1;i++){
        accVec.push(sunPos[i]-earthPos[i]);
    }

    //find argument of this vector
    var argRad = Math.atan(accVec[1]/accVec[0]);

    //correct the argument based on which quadrant it is in
    if (xPos < 0 && yPos < 0){
        argRad = argRad + Math.PI;
    } else if (xPos < 0 && yPos > 0){
        argRad = Math.PI - argRad;
    } else if (xPos > 0 && yPos < 0){
        argRad = 2(Math.PI)-argRad;
    } else{
        argRad = argRad;
    }

    var argDeg = argRad*180/Math.PI;

    // work out separate x and y components of velocity
    var aX = Math.cos(argRad)*aMag;
    var aY = Math.sin(argRad)*aMag;

    console.log(Math.sqrt((Math.pow(aX, 2))+(Math.pow(aY,2))));

    return [aX, aY];

}

function leapfrog (){
    var xPosPrevious = xPos;
    var yPosPrevious = yPos;
    var xVelPrevious = xVel;
    var yVelPrevious = yVel;
    var dt = 1000;
    //leapfrog for new position and velocity
    // not in loop as loops around newAnimate function
    var a = calAcc();
    var xVelNextInt = xVelPrevious + a[0]*dt;
    var yVelNextInt = yVelPrevious + a[1]*dt;
    xPos = xPosPrevious + ((xVelPrevious+xVelNextInt)/2)*dt;
    yPos = yPosPrevious + ((yVelPrevious+yVelNextInt)/2)*dt;
    xVel = ((xVelPrevious+xVelNextInt)/2)+a[0]*dt/2;
    yVel = ((yVelPrevious+yVelNextInt)/2)+a[1]*dt/2;

    // calculates scaled positions
    var xPosScaled = xPos / posScale;
    var yPosScaled = yPos / posScale;
    //calculates scaled velocities
    var xVelScaled = xVel / velScale;
    var yVelScaled = yVel / velScale;

    return [xPosScaled, yPosScaled, xVelScaled, yVelScaled];
}
...