繁体   English   中英

Java-弹跳弹丸-如何反转垂直速度?

[英]Java - Bouncing a projectile ball - How can I reverse vertical velocity?

我正在尝试用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);
    }
}

因此,这里的问题实际上是一个结构性的问题,使您变得比需要的更为复杂。 实际上,这实际上是数学而非编程问题。

您的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM