передача и вывод значения на консоль, но не рисование на холсте - PullRequest
0 голосов
/ 30 августа 2018

Есть несколько похожих вопросов, но ни один из ответов не решает мою проблему. Я моделирую солнечную систему, используя холст. Функция анимации вызывает функцию для обновления позиций, а затем эти позиции отображаются на экране в виде кружков. Я пытался не вызывать функцию animate и просто рисовать тела с использованием начальных условий, но это прекрасно работает, однако при попытке нарисовать их с помощью функции animate ничто не рисуется - даже солнце - даже несмотря на то, что функции были пройдены.

Почему они не рисуют на холсте?

вот код (я удалил цикл for, который рисовал бы все планеты только для рисования Земли только для целей развития, я также не скопировал все глобальные переменные вверху, так как они занимают много пробел):

var massList = [massMecury, massVenus, massEarth, massMars, massJupiter, massSaturn, massUranus, massNeptune];

var xPosList = [initialMecuryXPos, initialVenusXPos, initialEarthXPos, initialMarsXPos, initialJupiterXPos, initialSaturnXPos, initialUranusXPos, initialNeptuneXPos];
var yPosList = [initialMecuryYPos, initialVenusYPos, initialEarthYPos, initialMarsYPos, initialJupiterYPos, initialSaturnYPos, initialUranusYPos, initialNeptuneYPos];
var xVelList = [initialMecuryXVel, initialVenusXVel, initialEarthXVel, initialMarsXVel, initialJupiterXVel, initialSaturnXVel, initialUranusXVel, initialNeptuneXVel];
var yVelList = [initialMecuryYVel, initialVenusYVel, initialEarthYVel, initialMarsYVel, initialJupiterYVel, initialSaturnYVel, initialUranusYVel, initialNeptuneYVel];

//position and velocity scales so they fit on the screen
var posScale = 1.7E10;
//var velScale = 3E9;

var pauseButtonPressed = false;

function axis (){

    var canvas = document.getElementById("solarsys");
    c=canvas.getContext('2d');

    //moves the origin to the centre of the page
    c.translate(400, 275);
    //makes the y axis grow up and shrink down
    c.scale(1,-1);

    //c.fillRect(-innerWidth/2,-innerHeight/2,innerWidth,innerHeight); if want a black background
}

function calAcc(i) {

    //calculates distance between the earth and the sun
    var r = Math.sqrt((xPosList[i]*xPosList[i]) + (yPosList[i]*yPosList[i]));

    //calculates the angle of displacement between the earth and sun
    var theta = Math.atan(yPosList[i]/xPosList[i]);

    //calculate the force on the earth using F = Gm1m2/r^2
    //force is towards the centre of the sun
    var F = (G*massSun*massList[i])/(r*r);

    //correct the angle based on which quadrant it is in
    theta=Math.abs(theta);
    if (xPosList[i] < 0 && yPosList[i] < 0){
        theta = theta;
    } else if (xPosList[i] > 0 && yPosList[i] < 0){
        theta = Math.PI-theta;
    } else if (xPosList[i] > 0 && yPosList[i] > 0){
        theta = theta-Math.PI;
    } else{
        theta = (2*Math.PI)-theta;
    }

    var fX = Math.cos(theta)*F;
    var fY = Math.sin(theta)*F;

    //calculate earths acceleration using Newton 2nd a = F / m 
    var aX = (fX/massList[i]);
    var aY = (fY/massList[i]);

    return [aX, aY];
}

function leapfrog(i) {

    var dt = 5000;

    var a = calAcc(i);

    xVelList[i] = xVelList[i] + (a[0]*dt);
    yVelList[i] = yVelList[i] + (a[1]*dt);

    xPosList[i] = xPosList[i] + (xVelList[i]*dt);
    yPosList[i] = yPosList[i] + (yVelList[i]*dt);

}

function drawBody(i) {
    c.beginPath();
    c.arc(xPosList[i]/posScale, yPosList[i]/posScale, 1, 0, twoPi, false);
    c.stroke();
    c.closePath();  

    console.log('body drawn');
}

function drawSun(){
    //draw a yellow circle - the sun
    c.beginPath();
    c.arc(0, 0, 2, 0, twoPi, false);
    c.fillStyle = '#ffcc00';
    c.fill();
    c.stroke();
    c.closePath();
}

function animate() {

    var i = 2;

    //for (var i=0; i< xPosList.length; i++){
    leapfrog(i);

    drawBody(i);

    drawSun();

    console.log(xPosList);


    //clears canvas each new loop
    c.clearRect(-innerWidth/2,-innerHeight/2,innerWidth,innerHeight);

}


window.onload=function() {
    axis();

    var looper=setInterval(animate,1);}

1 Ответ

0 голосов
/ 30 августа 2018

Вам нужно исправить несколько проблем:

  1. У вас есть setInterval, который выполняется с паузами в 1 миллисекунду. Это кажется слишком быстрым, и я абсолютно не вижу никакой гарантии, что ваш браузер сможет рисовать то, что нужно нарисовать.

  2. В своей анимационной функции вы рисуете вещи, но мгновенно удаляете их. Сначала вам нужно очистить холст, а затем рисовать на нем вещи.

  3. Ваш код очень трудно читать, подумайте над его рефакторингом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...