以图形方式模拟java中两个粒子的物理影响

时间:2018-01-13 13:10:52

标签: java physics

我想用Java编写一个程序来模拟两个球之间的影响。

在线教程中,我在初稿后复制并修改了这个。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class grafico extends JPanel implements ActionListener {

    Timer tm = new Timer(5, this);
    int x1 = 0;
    int x2 = 0;
    int velX1 = 1;
    int velX2 = 1;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(x1, 160, 10, 10);
        g.setColor(Color.BLUE);
        g.fillRect(x2, x2, 10, 10);
        tm.start();
    }

    public void actionPerformed(ActionEvent e) {
        if (x1 < 0 || x1 > 500) {
            velX1 = -velX1;
        }
        x1 = x1 + velX1;

        if (x2 < 0 || x2 < 350) {
            velX2 = -velX2;
        }
        x2 = -x2 + velX2;
        repaint();
    }

    public static void main(String[] args) {
        grafico t = new grafico();
        JFrame jf = new JFrame();
        jf.setTitle("Tutorial");
        jf.setSize(600, 400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(t);
    }
}

在这个程序的实现中,我不想在线使用applet。

关于这个程序我想要改变的第一件事是:

球不会相互干扰,但是我希望它们相互作用,这样当碰撞时它们会改变轨迹。

我不知道要实现这个目标。

有人可以帮助我或告诉我它是否可能?

1 个答案:

答案 0 :(得分:2)

关于物理碰撞的主要想法是:

我们可以说当在2D规划系统中x1 = x2和y1 = y2 时,object1和object2相互碰撞。

但我们知道物体有尺寸,我们应该在计算中假设它们。因此,最好纠正我们关于两个对象碰撞的陈述:

当| x1-x2 |时,我们可以说object1和object2相互碰撞&LT; n和| y1-y2 | &LT; n在2D规划系统中,当n是对象宽度或高度的一半时。

同样在您的代码中,您绘制了一个正方形,g.fillRect中使用的起点是该正方形的左上角,而不是它的中心。所以你应该在计算中注意这一点。

因此,例如,您可以在班级中使用checkCollision方法,以检查每次要重新绘制时两个正方形是否发生碰撞。

在下面的代码中,您可以看到我只提供了一个简单的碰撞检查,因为我只是试图为您提供完整的工作解决方案。

在碰撞之后,取决于物体的质量及其速度和它们之前的方向以及碰撞的弹性,下一个方向和速度可以变化。因此,如果要模拟近似真实碰撞,则有两个参数。

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

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

public class grafico extends JPanel implements ActionListener {
    Timer tm = new Timer(5, this);
    int x1 = 0;
    int x2 = 0;
    int velX1 = 1;
    int velX2 = 1;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(x1, 160, 10, 10);
        g.setColor(Color.BLUE);
        g.fillRect(x2, x2, 10, 10);     
    }

    public void actionPerformed(ActionEvent e) {
        if (x1 < 0 || x1 > 500)
            velX1 = -velX1;
        x1 = x1 + velX1;

        if (x2 < 0 || x2 > 350)
            velX2 = -velX2;
        x2 = x2 + velX2;

        if( checkCollition() ) { // only two show the Idea.
            velX2 = -velX2;      // this code is not simulating a 
            x2 = x2 + velX2;     //    collision. You should change it
                                 //    in the future.
        }
        repaint();
    }

    private boolean checkCollition() {
        return Math.abs(x1-x2) < 10 && Math.abs(160-x2) < 10;
    }

    public static void main(String[] args) {
        grafico t = new grafico();
        JFrame jf = new JFrame();
        jf.setTitle("Tutorial");
        jf.setSize(600, 400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(t);
        t.tm.start();
    }
}

运行上面的代码并得到了想法后,您可能希望封装java对象中每个对象的x,y,前一个方向和速度向量,质量等,以便于编码。例如,您可以创建一个类Particle,然后将checkCollision方法的逻辑移动到此类更加优雅:

public class Particle{
    private int x;
    private int y;
    private int width;
    private int height;
    private float mass;
    //
    public Particle() {
        //...
    }

    public boolean collide(Particle other){
        return Math.abs(this.x-other.x) < width 
                && Math.abs(this.y-other.y) < height; // Just to illustrate the idea 
    }
}

然后在您的程序中,您可以创建两个实例Particle p1Particle p2,在您的代码中,您只需将if语句更改为:

if( p1.collide(p2) ) {
    // change the direction, velocity, ... of p1 and p2
}

希望这会有所帮助。