【问题标题】:Java - Bouncing a projectile ball - How can I reverse vertical velocity?Java - 弹跳弹丸 - 如何反转垂直速度?
【发布时间】:2018-12-05 05:52:59
【问题描述】:

我正在尝试在 java 中反弹一个球,但我正在努力弄清楚如何 当球击中视口时反转球速度的垂直分量。我的主要问题(可能很愚蠢)是我不明白 当速度公式对负值进行平方时,速度分量的方向(在本例中为 -)对整体速度有贡献。感谢您的帮助。

目前,我会在弹丸击中视口时以偏移量重新发射弹丸,但这存在角度错误的问题。

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

public class Trajectory5 extends JComponent {
private static final long serialVersionUID = 1L;

Timer timer; double x; double y; double vy; double vx;
double t = 0; double a = 70; double v = 40;
double offsetx = 0; double offsety = 400;
double xmult = 0;

public Trajectory5() {
    setFocusable(true);
    timer = new Timer(1, new TimerCallback()); 
    timer.start();}

    @Override
    public void paintComponent(Graphics g) {
        g.fillOval((int) x, (int) y, 10, 10);
    }

    protected class TimerCallback implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            t += .01;
            x = ((int) v*Math.cos(Math.toRadians(a)) * t + offsetx) + -xmult;
            y = getHeight() - ((int) v * Math.sin(Math.toRadians(a)) * t-.5 * 9.8 * (Math.pow(t, 2))) - offsety;
            vy = v * Math.sin(Math.toRadians(a)) - (t * 9.8);
            vx = v * Math.cos(Math.toRadians(a));

            System.out.println(vy + " " + vx);

            if (y > getHeight()) {
                offsetx = x;
                offsety = 0;
                v = Math.sqrt(Math.pow(vx, 2)+Math.pow(vy, 2));
                t = 0;
            }
            repaint();
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame(); frame.setSize(1000, 800);
        Trajectory5 canvas = new Trajectory5();
        frame.add(canvas); frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

  • 为什么不直接将速度乘以负 1?或者如果速度丢失了它的任何一部分
  • 这是我尝试的第一件事,但没有成功
  • 什么意思?这就是它的工作原理?问题是您还必须反映角度。例如如果它在垂直上方 60 度处进入,它会在垂直上方 30 度处碰撞
  • 我现在并不太担心角度,我只是希望它能够反弹而不必重新启动。当视口被击中并且球消失时,我将速度设置为否定。尽管不知何故,我可能做错了
  • 问题是我的 x 和 y 值根本不依赖于 vx 或 vy,我不知道如何调整它

标签: java animation graphics


【解决方案1】:

所以这里的问题实际上是一个结构性问题,你让它变得比它需要的更复杂。这实际上是一个数学问题,而不是编程问题。

您的 x 和 y 坐标从某个位置开始,然后您必须根据某个因素对其进行调整。您将根据 a) 调整位置。当时的速度,和c)。基于您使用的单位的任意分数

要逐步完成这些步骤,这实际上取决于您在做什么,但为了简单起见,假设您已经完成了 vx 和 vy 计算(您可以自己弄清楚),您的 actionPerformed 看起来像:

public void a...{
    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();
    ...
}

deltaXdeltaY 是您要移动球的实际距离。所以要移动它,我们必须将它应用于实际的 x 和 y 变量。

public void a...{
    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();

    x += deltaX;
    y += deltaY;
}

这将分别移动 x 和 y、deltaX 和 deltaY 距离。请注意,如果 deltaX 为负数,它将向左移动,如果 deltaY 为负数,它将向下(或向上,取决于您决定为负数)移动

我们快完成了,所以此时我们必须定义getTimeFraction()

public double getTimeFraction(){
    return 1 / iterationsPerSecond;
}

iterationsPerSecond 将被定义为每秒你想要的小动作量。

这涵盖了所有的运动,但是在此之前您需要定义 vx 和 vy 是什么,因此您的最终结果将类似于:

public void a...{
    calculateVelocities();

    deltaX = vx * getTimeFraction();
    deltaY = vy * getTimeFraction();

    x += deltaX;
    y += deltaY;
}

【讨论】:

  • 非常感谢您的帮助。唯一的问题是我的弹丸现在在第一次反弹时非常迅速地加速到外太空,但在反弹时将速度重置为原始值似乎没有任何作用。再次感谢我真的走错路了
  • 现在的主要问题是如果不重置它,它会加速到无穷大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多