0

初期水平速度で落下物をシミュレートしようとしています。水平方向に移動する方法は理解していますが (加速なし)、方程式 y = gt^2/2 + vt + y0 のために垂直方向に移動するのに問題があります。二次方程式のため問題があります。

私がやろうとしたことは、SwingTimer によってアクションが実行されるたびに 1 ずつ増加する時間変数を作成することです。私が実際に時変数を持つように。しかし、それが最善の方法だとは思いませんか?

誰かが私を正しい方向に押し進めることができますか?

以下に、私がすでに書いたコードを示します。

    public class Simulation extends JPanel implements ActionListener
    {
    Timer timer = new Timer(5,this);;
    private int Xpos=0, Ypos=0, velX, velY;
    private int Px,Py;

    JButton dropknop;
    private boolean drop = false;

    public Simulation()
    {
        this.setBackground(Color.white);
        velX = 2;
        velY = 2;

        dropknop = new JButton("DROP");
        dropknop.addActionListener(this);
        this.add(dropknop);
    }
    public int getXpos() {
        return Xpos;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawRect(Xpos, 0, 20, 20);

        if(drop)
        {
            g.fillRect(Px, Py, 5, 5);
        }
    }

    public void actionPerformed(ActionEvent ae) 
    {
        if(ae.getSource() == dropknop)
        {
            Px = getXpos();
            this.drop = true;
        }
        if(Xpos<0 || Xpos>986)
        {
            velX = -velX;
        }
        if(Ypos<0 || Ypos>708)
        {
            velY = - velY;
        }

        if(drop)
        {
            Px += velY;
            Py += velX;
        }

        Ypos += velY;
        Xpos += velX;
        repaint();
    }
}

前もって感謝します!

4

1 に答える 1

0

重力は、各フレームの Y 速度から定数 (重力による加速度) を (正の Y 方向が上であると仮定して) 単純に差し引くことで実装できます。

数式y = gt^2/2 + vt + y0は、指定された時間後の位置を計算するためのものですが、フレームごとにシミュレートしているため、インクリメンタル メソッドが必要です。

velY = velY - gravity;

これにより、 の近似値が得られますy = gt^2/2 + vt + y0。どの程度発散するかは、タイム ステップによって異なります。違いの理由は、これはステップ間の連続的な加速をシミュレートしないためです。(理論的には、タイム ステップが無限に小さい場合でも、結果は同じになります)。

より正確にする 1 つの方法 (少なくとも一部の物理エンジンで使用) は、フレームごとに複数のステップを計算することです (つまり、表示を更新する前に物理を数回繰り返します)。

科学的に正確なシミュレーションのために、他の力が体に作用していない場合、投稿で提案する方法が最も正確です.


あなたのactionPerformedメソッドでは、おそらく、位置を更新する前にアクションがタイマー イベントであることを確認する必要があります (別のイベントが発生した場合に速く移動しないようにするため)。

于 2013-04-21T14:49:44.210 に答える