What are some algorithms that will allow me to simulate planetary physics?

前端 未结 12 766
离开以前
离开以前 2021-01-30 17:37

I\'m interested in doing a \"Solar System\" simulator that will allow me to simulate the rotational and gravitational forces of planets and stars.

I\'d like to be able t

12条回答
  •  别跟我提以往
    2021-01-30 18:27

    It looks like it is very hard and requires strong knowledge of physics but in fact it is very easy, you need to know only 2 formulas and basic understanding of vectors:

    Attractional force (or gravitational force) between planet1 and planet2 with mass m1 and m2 and distance between them d: Fg = G*m1*m2/d^2; Fg = m*a. G is a constant, find it by substituting random values so that acceleration "a" will not be too small and not too big approximately "0.01" or "0.1".

    If you have total vector force which is acting on a current planet at that instant of time, you can find instant acceleration a=(total Force)/(mass of current planet). And if you have current acceleration and current velocity and current position, you can find new velocity and new position

    If you want to look it real you can use following supereasy algorythm (pseudocode):

    int n; // # of planets
    Vector2D planetPosition[n]; 
    Vector2D planetVelocity[n]; // initially set by (0, 0)
    double planetMass[n];
    
    while (true){
        for (int i = 0; i < n; i++){
            Vector2D totalForce = (0, 0); // acting on planet i
            for (int j = 0; j < n; j++){
                if (j == i)
                    continue; // force between some planet and itself is 0
                Fg = G * planetMass[i] * planetMass[j] / distance(i, j) ^ 2;
            // Fg is a scalar value representing magnitude of force acting
            // between planet[i] and planet[j]
            // vectorFg is a vector form of force Fg
            // (planetPosition[j] - planetPosition[i]) is a vector value
            // (planetPosition[j]-planetPosition[i])/(planetPosition[j]-plantetPosition[i]).magnitude() is a
            // unit vector with direction from planet[i] to planet[j]
                vectorFg = Fg * (planetPosition[j] - planetPosition[i]) / 
                      (planetPosition[j] - planetPosition[i]).magnitude();
                totalForce += vectorFg;
            }
            Vector2D acceleration = totalForce / planetMass[i];
            planetVelocity[i] += acceleration;
        }
    
        // it is important to separate two for's, if you want to know why ask in the comments
        for (int i = 0; i < n; i++)
            planetPosition[i] += planetVelocity[i];
    
        sleep 17 ms;
        draw planets;
    }
    

提交回复
热议问题