Применение силы тяжести к прыгающему мячу

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

Дело в том, что я хочу, чтобы мяч в конце концов перестал двигаться. Например, я запускаю программу, мяч падает и отскакивает, может быть, до 80% своей начальной высоты. И когда он снова упадет, он будет ускоряться из-за силы тяжести, а затем снова поднимется, но, возможно, достигнет только около 60% своей первоначальной высоты, и в конце концов он перестанет двигаться.

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

Вот мой код:

РЕДАКТИРОВАТЬ: УБЕДИТЕСЬ, что у меня нет основного метода для этого класса, поскольку он мне не нужен. Я пропускаю его через другой класс через объект.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Game extends JPanel implements ActionListener{

    int DIAMETER = 40;
    int yPos;
    int yVel = 3;
    int GRAVITY =1;

    Timer tm = new Timer(5,this);

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        //Setting the characteristics for the ball
        g.setColor(Color.red);
        g.fillOval(0, yPos, DIAMETER, DIAMETER);
        tm.start();
        repaint();
    }

    public void actionPerformed(ActionEvent e) {

        //If it decides to go out of the screen, change direction.
        if(yPos<0 || yPos>430)yVel=-yVel;

        //This basically is the "engine". It moves the ball.
        yPos = yPos + yVel;

    }
}

person user3047432    schedule 12.12.2013    source источник
comment
eng.mu.edu/~nagurka/   -  person OldProgrammer    schedule 12.12.2013
comment
Концепция, о которой вы говорите, называется упругими столкновениями, посмотрите ее, вы узнаете, что делать, чтобы применить физическое уравнение к вашей симуляции.   -  person MangO_O    schedule 12.12.2013
comment
Нет, это определенно неэластично.   -  person user2357112 supports Monica    schedule 12.12.2013
comment
это то же самое, коэффициент эластичности всего 0   -  person MangO_O    schedule 12.12.2013
comment
@MangO_O: я не думаю, что коэффициент эластичности означает то, что вы думаю, что это так, и если бы то, о чем вы хотите говорить, было бы 0, это, вероятно, было бы совершенно неупругим столкновением. Это не совершенно неупругое столкновение.   -  person user2357112 supports Monica    schedule 12.12.2013


Ответы (1)


Уберите немного энергии из системы.

Так же, как он ударяется о землю, кинетическая энергия равна E = 0.5 * m * v * v, где m - масса, а v скорость.

Уменьшите E на определенную величину, скажем, на new_E = 0.8 * E. Затем вычислите новую начальную восходящую скорость, используя преобразованную формулу кинетической энергии.

Это на удивление реалистично. Конечно, вам не нужен коэффициент 0,5, но я оставил его там, чтобы физики были довольны. Вам также не нужно m.

person Bathsheba    schedule 12.12.2013
comment
И поскольку E = mgh это должно фактически давать уменьшение высоты ровно на 80% при каждом отскоке. - person Zong; 12.12.2013
comment
Да, это очень полезно! Я обязательно это сделаю! Но мне просто интересно, как мне сказать Java уменьшить E после удара? Полагаю, я мог бы написать что-то вроде: если мяч ударяется о стену, уменьшите энергию. Но как бы я выразил это в коде? - person user3047432; 12.12.2013
comment
Все это можно упростить, умножив скорость на константу. Более насущная трудность, по-видимому, связана с переводом мысли в код. - person user2357112 supports Monica; 12.12.2013
comment
@ user2357112 Не совсем так, поскольку член скорости возведен в квадрат. - person Zong; 12.12.2013
comment
@ZongZhengLi: Это просто означает, что константа - это квадратный корень из того, на что вы умножили энергию. - person user2357112 supports Monica; 12.12.2013
comment
Мне нравится думать об этом в терминах v, с тех пор вы можете применить s = vt - 0.5gtt, чтобы получить максимальное смещение (при движении вверх). Лучше с плавающей запятой работать с абсолютной высотой s. Тем не менее, в данном случае я сомневаюсь, что точность имеет слишком большое значение. - person Bathsheba; 12.12.2013
comment
Собственно, ребята, это не решило. Я не знаю, как это применить. Как мне сказать Java, что я хочу что-то сделать, когда мяч ударяется о землю? Как я мог описать это в коде? - person user3047432; 12.12.2013
comment
У вас больше шансов получить полный ответ, если вы предложите награду. Но сначала вам нужно набраться репутации. Самый быстрый способ - ответить на несколько вопросов. Но вы также можете добиться небольших успехов, редактируя вопросы. - person Bathsheba; 12.12.2013