简体   繁体   中英

NBody code that won't work in java - what do I need to fix?

I wrote this code in Eclipse to solve the NBody physics equation however there is an unresolved error. In this line "double Fnet = G mass mass/(dist dist);" eclipse underlines G mass in red and gives me the message "The operator * is undefined for the argument type(s) double, double[]." How do I resolve this issue? The full code is included below.

public class NBody {

    public static final String PLANETS_FILE = "planets.txt";

    // animation pause (in miliseconds)
    public static final int DELAY = 20;

    // music (2001 theme)
    public static final String MUSIC = "2001theme.wav";

    // background image
    public static final String BACKGROUND = "starfield.jpg";

    // gravitational constant (N m^2 / kg^2)
    public static final double G = 6.67e-11;

                                        // parameters from command line
    public static double T;             // simulate from time 0 to T (s)
    public static double dt;            // time quantum (s)

                                        // parameters from first two lines 
    public static int N;                // number of bodies
    public static double R;             // radius of universe

    public static double[] rx;          // x position (m)
    public static double[] ry;          // y position (m)
    public static double[] vx;          // x velocity (m/s)
    public static double[] vy;          // y velocity (m/s)
    public static double[] mass;        // mass (kg)
    public static String[] image;       // name of gif

    // TODO: read the planet file, new the parallel arrays, and load
    // their values from the file.
    public static void loadPlanets(String planetFileName) {
        java.util.Scanner input = new java.util.Scanner(System.in);

            int N = input.nextInt();
            double R = input.nextDouble();
            double[] rx = new double[N];          
            double[] ry = new double[N];         
            double[] vx = new double[N];          
            double[] vy = new double[N];          
            double[] mass = new double[N];        
            String[] image= new String[N];

            for (int i = 0; i < N; i++) {

                    rx[i] = input.nextDouble();
                    ry[i] = input.nextDouble(); 
                    vx[i] = input.nextDouble();
                    vy[i] = input.nextDouble(); 
                    mass[i] = input.nextDouble(); 
                    image[i] = "./images/" + input.next();
                }  

        } 




    public static void runSimulation() {

        // run numerical simulation from 0 to T
        for (double t = 0.0; t < T; t += dt) {

            // the x- and y-components of force
            double[] fx = new double[N];
            double[] fy = new double[N];

            // calculate forces on each object
            for (int i = 0; i < N; i++) {

                // reset forces to zero 
                fx[i] = 0.0;
                fy[i] = 0.0;

                for (int j = 0; j < N; j++) {
                    if (i != j) {
                        double dx = rx[j] - rx[i]; 
                        double dy = ry[j] - ry[i]; 
                        double dist = Math.sqrt(dx*dx + dy*dy);
                        double Fnet = G*mass*mass/(dist*dist);

                        fx[i] += Fnet * dx / dist;
                        fy[i] += Fnet * dy / dist; 
                    }
                } 
            }

            //calculate acceleration, velocities and positions
            double ax = 0.0;
            double ay = 0.0;
            for (int i = 0; i < N; i++) {
                ax = fx[i] / mass[i];
                ay = fy[i] / mass[i];

                vx[i] += dt * ax;
                vy[i] += dt * ay;

                rx[i] += dt * vx[i];
                ry[i] += dt * vy[i];



            // draw background and then planets
            StdDraw.picture(0, 0, BACKGROUND);
            StdDraw.picture(rx[i], ry[i], image[i]); 

            //loop to plot the N bodies

            // pause for a short while, using "animation mode"
            StdDraw.show(DELAY);
            }
        }

    }

    public static void main(String[] args) {

        // TODO: read T and dt from command line.
        T = 0;

        // load planets from file specified in the command line
        String planetFileName = "planets.txt";
        loadPlanets(planetFileName);

        // rescale coordinates that we can use natural x- and y-coordinates
        StdDraw.setXscale(-R, +R);
        StdDraw.setYscale(-R, +R);

        StdAudio.play( MUSIC );

        // turn on animation mode
        StdDraw.show(0);

        // Run simulation
        runSimulation();

        // print final state of universe to standard output
        System.out.printf("%d\n", N);
        System.out.printf("%.2e\n", R);
        for (int i = 0; i < N; i++) {
            System.out.printf("%11.4e %11.4e %11.4e %11.4e %11.4e %12s\n",
                          rx[i], ry[i], vx[i], vy[i], mass[i], image[i]);
        }

    }
}

You actually tried to do this:

double * double[] * double[] / ( double * double )

which obviously (I hope it is obvious) will not work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM