【发布时间】: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,我不知道如何调整它