JavaScript N-Body Gravity Modeling

So, I'm trying to create a N-Body gravity simulation in JavaScript:

http://jsfiddle.net/4M94x/

var Circle = function(c, r, cor, cof) { // Fix CoR & CoF // Had to add code for JSFiddle link :P
    this.c = c
    this.r = r
    this.m = r * r * Math.PI
    this.v = new Vector()
    this.cor = cor
    this.cof = cof
}

The problem is that when you start (click) and put 2 balls (randomly renamed "particles") next to each other, they begin to generate speed, push each other faster and faster. How to fix this, by the way, is my gravity the correct implementation?

+3
source share
1 answer

: Euler forward ODE, Euler forward . , .

, , () , Verlet- (Stoermer-Cromer -...- Newton- ).

-, , , .

. "" Stoermer-Verlet -...- Newton, postprint preprint "Moving stars around" ++ Ruby.


: .

g*m1*m2*(p2-p1)/norm(p2-p1)^3

g*m1*m2/norm(p2-p1)

,

 g*m1*m2*ln(norm(p2-p1))

, 2D- 3D-.


Verlet :

a = Vector() , update(),

function compute_forces() {
    for (var i = 0; i < particles.length; i++) {
        var p = particles[i];
        p.a.set(0);

        for (var j = 0; j < i; j++) {
            var p2 = particles[j];

            var d = p.c.sub(p2.c);
            var norm = Math.sqrt(100.0 + d.lengthSq());
            var mag = gravity / (norm * norm * norm);

            p.a.set(p.a.sub(d.mul(mag * p2.m)));
            p2.a.set(p2.a.add(d.mul(mag * p.m)));

        }
    }

}


function do_collisions() {
    for (var i = 0; i < particles.length; i++) {
        var p = particles[i];
        for (var j = 0; j < i; j++) {
            var p2 = particles[j];

            if (checkCCCol(p, p2)) {
                resCCCol(p, p2);
            }
        }
    }
}


function do_physics(dt) {
    // do velocity Verlet 
    // with consistent state at interval half points
    // x += 0.5*v*dt
    for (var i1 = 0; i1 < particles.length; i1++) {
        var p1 = particles[i1];
        p1.c.set(p1.c.add(p1.v.mul(0.5 * dt)));
    }
    // a = A(x)
    compute_forces();
    // v += a*dt
    for (var i2 = 0; i2 < particles.length; i2++) {
        var p2 = particles[i2];
        p2.v.set(p2.v.add(p2.a.mul(dt)));
    }
    // x += 0.5*v*dt
    for (var i3 = 0; i3 < particles.length; i3++) {
        var p3 = particles[i3];
        p3.c.set(p3.c.add(p3.v.mul(0.5 * dt)));
    }
    do_collisions();
}

function update() {

    for (var k = 0; k < 4; k++) {
        do_physics(1.0 / 4);
    }

    render();

    RAF(update);
}

. http://jsfiddle.net/4XVPH/


(, ), ​​ : http://jsfiddle.net/24mg6ctg/12/

+17

Source: https://habr.com/ru/post/1684582/


All Articles