В анимации javascript, касающейся второго закона Кеплера, проблема реализации изменяющейся скорости - PullRequest
0 голосов
/ 26 ноября 2018

Я делаю анимацию в javascript, используя холст HTML, чтобы имитировать 2-й закон Кеплера для школьного проекта.Вот ссылка, чтобы понять Второй закон Кеплера.https://www.windows2universe.org/the_universe/uts/kepler2.html

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

Кроме того,скорость планеты вокруг Солнца увеличивается, когда оно ближе, и уменьшается, когда оно дальше.Мы можем связать это, разделив некоторое число на расстояние от квадрата солнца или v = 50000 / r ^ 2.

Для анимации я использую windowRequestAnimationFrame.Чтобы добиться реальной анимации, я использую полярную систему координат.http://mathworld.wolfram.com/PolarCoordinates.html

Я модулирую угол, умножая его на объект времени.Затем я умножаю его на скорость.

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

Мне кажется, что есть простое решение, которое я не могу понять.У меня есть ссылка на мой полный код, который полностью функционален и может быть запущен в браузере.https://drive.google.com/file/d/1EoDgzoSVFDJ-hJMXuA47rBwjQ9vMQFbD/view?usp=sharing

Спасибо за внимание.

    // Initial Angle Values

    var Ang1 = Math.PI;
    var Ang2 = 2 * Math.PI;



  // Initial Distances from the center of the ellipse

    var distance = Distance(Ang1)
    var distance2 = Distance(Ang2)

// X,Y coordinates derived from the distance using sin,cos functions

    var line1_x = orbit.centerx +(distance *  Math.cos(Ang1))
    var line1_y = orbit.centery +(distance *  Math.sin(Ang1))
    var line3_x = orbit.centerx +(distance2 *  Math.cos(Ang2))
    var line3_y = orbit.centery + (distance2 *  Math.sin(Ang2))


// Initial Distance from the sun using the distance formula
    var focalDistance1 = coordDistance(line1_x,line1_y,sun_x,sun_y)
    var focalDistance2 = coordDistance(line3_x,line3_y,sun_x,sun_y)


// Initial velocityies calculated using distance from the sun
    var velocity1 = 50000/Math.pow(focalDistance1,2)
    var velocity2 = 50000/Math.pow(focalDistance2,2)









// Multiplying the initial angles by time to animate and velocity to speed up
    var orbitAngle = ((Ang1/60)*time.getSeconds() + (Ang1/60000)* time.getMilliseconds())* velocity1;
    var orbitAngle3 = ((Ang2/60)*time.getSeconds() + (Ang2/60000)* time.getMilliseconds())* velocity2;

// The polar angle coords of the point ahead by the time interval, multiplying by time to animate and velocity to speed up
    var orbitAngle2 = (   ((Ang1/60) * (time.getSeconds()+timeInterval)) + ((Ang1/60000)*(time.getMilliseconds()+timeInterval*1000))) * velocity1;
    var orbitAngle4 = ( ((Ang2/60) * (time.getSeconds()+timeInterval)) + ((Ang2/60000)*(time.getMilliseconds()+timeInterval*1000))) * velocity2;








    //Animating time interval positions using distance and angle
    var distance = Distance(orbitAngle)
    var distance2 = Distance(orbitAngle2)
    var distance3 = Distance(orbitAngle3)

    var distance4 = Distance(orbitAngle4)



    var line1_x = orbit.centerx +(distance *  Math.cos(orbitAngle))
    var line1_y = orbit.centery +(distance *  Math.sin(orbitAngle))
    var line2_x = orbit.centerx +(distance2 *  Math.cos(orbitAngle2))
    var line2_y = orbit.centery + (distance2 *  Math.sin(orbitAngle2))

    var line3_x = orbit.centerx + (distance3 *  Math.cos(orbitAngle3))
    var line3_y = orbit.centery + (distance3 *  Math.sin(orbitAngle3))
    var line4_x = orbit.centerx +(distance4 *  Math.cos(orbitAngle4))
    var line4_y = orbit.centery + (distance4 *  Math.sin(orbitAngle4))


    var focalDistance1 = coordDistance(line1_x,line1_y,sun_x,sun_y);
    var focalDistance2 = coordDistance(line3_x,line3_y,sun_x,sun_y);

    var velocity1 = 50000/Math.pow(focalDistance1,2)
    var velocity2 = 50000/Math.pow(focalDistance2,2)
...