Warum verlangsamt sich Raphaels Framerate bei diesem Code?

So mache ich gerade einen einfachen Umlaufbahnsimulator mit Raphael JS, bei dem ich einen Kreis als "Stern" und einen anderen Kreis als "Planet" zeichne. Es scheint gut zu funktionieren, mit dem einen Haken, dass sich die Framerate im weiteren Verlauf der Simulation allmählich verlangsamt, bis die Orbitalbewegung nicht mehr flüssig erscheint. Hier ist der Code (Hinweis: Verwendet jQuery nur zum Initialisieren der Seite):

$(function() {
    var paper = Raphael(document.getElementById('canvas'), 640, 480);
    var star = paper.circle(320, 240, 10);
    var planet = paper.circle(320, 150, 5);
    var starVelocity = [0,0];
    var planetVelocity = [20.42,0];
    var starMass = 3.08e22;
    var planetMass = 3.303e26;
    var gravConstant = 1.034e-18;
    function calculateOrbit() {
        var accx = 0;
        var accy = 0;
        accx = (gravConstant * starMass * ((star.attr('cx') - planet.attr('cx')))) / (Math.pow(circleDistance(), 3));
        accy = (gravConstant * starMass * ((star.attr('cy') - planet.attr('cy')))) / (Math.pow(circleDistance(), 3));
        planetVelocity[0] += accx;
        planetVelocity[1] += accy;
        planet.animate({cx: planet.attr('cx') + planetVelocity[0], cy: planet.attr('cy') + planetVelocity[1]}, 150, calculateOrbit);
        paper.circle(planet.attr('cx'), planet.attr('cy'), 1); // added to 'trace' orbit
    }
    function circleDistance() {
        return (Math.sqrt(Math.pow(star.attr('cx') - planet.attr('cx'), 2) + Math.pow(star.attr('cy') - planet.attr('cy'), 2)));
    }
    calculateOrbit();
});

Für mich sieht es sowieso nicht so aus, als würde ein Teil dieses Codes die Animation allmählich zum Crawling verlangsamen. Daher ist jede Hilfe bei der Lösung des Problems dankbar!