Реализация снаряда движения - PullRequest
1 голос
/ 22 июля 2011

Я создал симуляцию движения снаряда на Java с пользовательским интерфейсом.Программа позволяет пользователю вводить исходные значения для расчета снаряда объекта.У меня сейчас ничего не настроено, чтобы рисовать снаряд на экране.

У меня есть отдельный рабочий поток пружины, обрабатывающий код моделирования в фоновом режиме.

Я также добавил в обнаружение столкновений, чтобы, когда объект ударялся о землю, он подпрыгивал и продолжал делать это до тех пор, покацикл завершается.

Уравнения, которые у меня есть, не верны для того, чего я пытаюсь достичь.

При следующих начальных условиях, вот что дает график выводимых данных:

Initial Conditions:
Angle: 30 degrees;
Initial Speed 8.66 m/s;
Height: 50 m;
Elasticity of object: .5 coefficient of restitution in the y direction;
Acceleration: -9.8 m/s^2;
No acceleration in the x direction

enter image description here

Похоже, что после начала моделирования, yстановится все больше и больше, поэтому цикл никогда не завершится сам по себе.

Вот код:

    //This class will handle all time consuming activities
class Simulation extends SwingWorker<Void, Void>
{
    //Execute time consuming task
    protected Void doInBackground() throws Exception 
    {
        FileWriter fstream = new FileWriter("output.txt");

        BufferedWriter out = new BufferedWriter(fstream);

        double angle = Double.valueOf(angleText.getText());
        double radians = angle * (Math.PI/180); 
        double vel = Double.valueOf(speedText.getText()); 
        double mass = Double.valueOf(massText.getText()); 
        double y = Double.valueOf(heightText.getText());
        double x = 0;
        double epX = Double.valueOf(epxText.getText());
        double epY = Double.valueOf(epyText.getText());
        double ax = Double.valueOf(accxText.getText());
        double ay = Double.valueOf(accyText.getText()); 

        int numBounces = 0;
        double deltaTime = .00000001; 
        double total_velocity = 0.0;
        double time = 0.0;

        String fs; 

        angle = angle * Math.PI / 180; 

        while(numBounces < 10)
        {
            //Increment Time
            time = time + deltaTime;

            //Calculate new values for velocity[x] and velocity[y]
            double vx = (vel*Math.cos(angle)) + ax*time;;
            double vy = (vel*Math.sin(angle)) + ay*time; 

            //Calculate new values for x and y
            x = x + vx*time;
            y = y + vy*time + .5*ay*(time*time); 

            System.out.format("%.3f\n", y); 

            fs = String.format("%f\t %f\t %f\t %f\t %f\t %f\t %f\t\n", ax, ay, x, y, vx, vy, time); 

            out.write(fs); 

            //If ball hits ground: y < 0
            if(y < 0)
            {
                numBounces++;

                System.out.println("Number of Bounces: " + numBounces); 

                //Why is this statement needed if the velocity in the y direction is already being reversed?
                vy = -vy - ay*time; //  vy = -vy - ay*time; 

                //Calculate angle
                angle = Math.atan(vy/vx);

                angle = angle * Math.PI / 180; 

                //Calculate total velocity
                total_velocity = Math.sqrt((vy*vy) + (vx*vx));

                //Velocity with elasticity factored in
                total_velocity = Math.sqrt((epY) * total_velocity);

                //New velocities for when ball makes next trip
                vy = total_velocity*Math.sin(angle); 
                vx = total_velocity*Math.cos(angle);

                out.write(fs); 

            }

            //Draw projectile

                //Thread.sleep(.00001); //Sleep for deltaTime - 10 nanoseconds or draw after n number of points
        }

        out.close(); 

        return null;
    }

    //SwingWorker lets you execute code on the event dispatching thread. Also allows you to update the GUI
    public void done()
    {
        try
        {               
            /*
            rangeText.setText(" " + x);
            heightTText.setText(" " + y); 
            timeText.setText(" " + time);
             */
        }

        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

В чем может быть возможная проблема?Я предполагаю, что это может иметь отношение к ракурсу.В предыдущей версии кода, где я не учитывал угол, все работало нормально.Кроме того, я не уверен, нужно ли устанавливать границы для графического интерфейса, чтобы у вас не было вечности.

У меня также есть исключение NullPointerException.

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Первая проблема, которую я вижу здесь:

//Calculate angle
angle = Math.atan(vy/vx);
angle = angle * Math.PI / 180; 

Math.atan возвращает значение в радианах:

Возвращает арктангенс значения;возвращаемый угол находится в диапазоне от -pi / 2 до pi / 2.

Так что * Math.PI / 180 не окажет вам никакой пользы.

Вторая проблема здесь:

//Calculate new values for velocity[x] and velocity[y]
double vx = (vel*Math.cos(angle)) + ax*time;;
double vy = (vel*Math.sin(angle)) + ay*time; 

При каждом прохождении цикла эти значения повторно инициализируются.Поскольку angle, ax, ay и time не могут измениться во время цикла, это означает, что вы всегда получаете одинаковые vx и (положительные) vy.vy должно уменьшаться с каждым проходом цикла, что-то вроде:

//Calculate initial values for velocity[x] and velocity[y]
double vx = (vel*Math.cos(angle)) + ax*time;
double vy = (vel*Math.sin(angle)) + ay*time; 

while(numBounces < 10) {
    //Increment Time
    time = time + deltaTime;

    //Calculate new values for x and y
    x = x + vx*time;
    y = y + vy*time + .5*ay*(time*time); 

    //Calculate new values for velocity[x] and velocity[y]
    vx += ax * time;
    vy += ay * time;
0 голосов
/ 22 июля 2011

Вам нужно научиться использовать отладчик - в Eclipse, например. Затем вы можете остановиться где угодно и исследовать переменные, пока не выясните, где именно вы делаете неправильный поворот (или не выбираете правильный, в данном случае). Вы сможете понять это через минуту или около того.

Если это не вариант, начните помещать в консоль распечатки ключевых данных.

В коде всегда есть ошибки, и вы часто не можете их выяснить, просто взглянув на них - независимо от того, насколько сложным и как долго.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...