Позиционирование вращающегося объекта в Javascript

Я создаю интерактивный холст Солнечной системы в Javascript.

Планеты вращаются вокруг Солнца с тригонометрической функцией. Этот конкретный код был написан для меня, поэтому я не знаю, как он работает точно.

Чтобы планеты располагались правильно, чтобы они вращались вокруг Солнца, я могу только расположить их ось X, не касаясь их оси Y. Но всякий раз, когда я обновляю страницу, они начинаются с очень нереальных позиций. Это можно исправить, зная, как правильно их расположить, или изменив скорости планет.

Вот большая часть соответствующего кода:

    function initCanvas(){

    var ctx = document.getElementById('my_canvas').getContext('2d');
    var dynamicSunW = 25;
    var dynamicSunH = 0;
    var dynamicSunX = (ctx.canvas.width * .5) - (Math.PI* 1 * .5);  
    //dynamicSun is always at dead center of canvas
    var dynamicSunY = (ctx.canvas.height * .5) - (dynamicSunH * .5);
    var angleOfSun = 0;

    var posMercuryX = (ctx.canvas.width * .5) - (Math.PI* 1 * .5) - 50;  
    var posMercuryY = (ctx.canvas.height * .5) - (dynamicSunH * .5) + 20;
    var gravityMercury = {x: posMercuryX, y: posMercuryY };

    var posVenusX = (ctx.canvas.width * .5) - (Math.PI* 1 * .5) - 50;
    var posVenusY = (ctx.canvas.height * .5) - (dynamicSunH * .5) + 46;
    var gravityVenus = {x: posVenusX, y: posVenusY };
    /*these variables with lots of calculations behind them simply represent
    dynamic positions based on canvas width and height so that whenever i change
    the canvas size, the positions will still be the same in relation to the size
     */     

    //this code was not written by, the trigonometric function
        function rotate_point(pointX, pointY, originX, originY, ang) {
            ang =  Math.PI / 180.0;
            return {

                    x: Math.cos(ang) * (pointX-originX) - 
Math.sin(ang) * (pointY-originY) + originX ,
                    y: Math.sin(ang) * (pointX-originX) + 
Math.cos(ang) * (pointY-originY) + originY 
                };
            }


            //an array of each planet with their own position, size and style
        var Solarsystem = {     
        Venus: {
                render: function(){
                    ctx.beginPath();
                    gravityVenus = rotate_point(gravityVenus.x, gravityVenus.y, 
dynamicSunX, dynamicSunY, angleOfSun);
                    ctx.arc(gravityVenus.x,gravityVenus.y ,7, 0, 2*Math.PI);
                ctx.fillStyle = "rgba(255,165,0,1)"; 
                ctx.closePath();
                ctx.fill();
            }
        }
        , Mercury: {
            render: function(){
            ctx.beginPath();
            gravityMercury = rotate_point(gravityMercury.x, 

gravityMercury.y, 
dynamicSunX, dynamicSunY - 2, angleOfSun);
                ctx.arc(gravityMercury.x,gravityMercury.y ,5, 0, 2*Math.PI);

            ctx.fillStyle = "rgba(119,136,153,1)";  


            ctx.closePath();
            ctx.fill();
            ctx.stroke();
            }
        }
        , Sun: {
        render: function(){
        ctx.fillStyle = "rgba(255,255,51,1)";  
        ctx.save(); //store ctx so it can  be later reused 
        ctx.shadowColor = 'yellow';
        ctx.shadowBlur = 70;
        ctx.shadowOffsetX = 0;
        ctx.shadowOffsetY = 0;  
        ctx.beginPath();
        ctx.arc(dynamicSunX, dynamicSunY, dynamicSunW, 

dynamicSunH, Math.PI*2, true);


    ctx.closePath();
        ctx.fill();
        ctx.restore(); //ctx at time of save

А вот как я устанавливаю интервал анимации

function animate(){
        background.render();
        Solarsystem.Neptune.render();       
        Solarsystem.Uranus.render();
        Solarsystem.Saturn.render();
        Solarsystem.Jupiter.render();   
        Solarsystem.Mars.render();
        Solarsystem.Earth.render();
        Solarsystem.Venus.render();
        Solarsystem.Mercury.render();       
        Solarsystem.Sun.render(); 
    }

     var animateInterval = setInterval(animate, 1000/60);  

PS: я задал другой вопрос о том, как я могу ускорить каждую планету. Я все еще жду ответа. Если вы знаете, как, пожалуйста, пришлите мне ответ на этот вопрос тоже! В JS, как иметь несколько рисунков на разных скоростях?

0 ответов

Другие вопросы по тегам