我正在二维空间中模拟一个球,画出它的路径。
我正在使用g.fillOval(x,y,height,width);
来画球
球受到三种力的影响:重力,风力和击球力,它也有一个起始角度。
这张照片说明了我的意思
知道球从x=11 y=360
我想在任何时间根据球的位置和所提到的力量改变x和y的值。
这样做的方程式应该是
x += Angle Power Gravity Wind
y -= Angle Power Gravity Wind
编辑:“射击力”是指初始速度。
答案 0 :(得分:3)
如果你研究过物理学,这个等式是众所周知的。这是2D中的牛顿定律:
sum(forces) = mass * acceleration
这实际上是三个方程,因为力,加速度,速度和位移都是矢量。
您可以通过假设2维来简化。
在简化视图中,重力始终以负y方向作用;没有x组件。
风可以在方向上变化,所以你需要说明它是如何随着时间的推移而演变的,或者假设它在你正在学习的时期内是不变的。
球的质量是固定的。它足够大,可以忽略量子效应。
速度远小于光速,因此可以忽略相对论效应。
你需要了解一下微积分 - 你呢?这些是时间上的微分方程。您将从初始条件开始,或者以封闭形式进行积分,或者在时间步长中以数字方式向前推进方程,以查看运动如何演变。
让我们轻松:在负x方向上持续风。
我不知道“击球力量”是什么,但我打赌你会知道球的最初速度,因为它是从大炮射出的。
以下是您需要的变量:
ax = acceleration of the ball in the x-direction
ay = acceleration of the ball in the y-direction
fx = wind resistance force
fy = gravity
vx = velocity of the ball in the x-direction
vy = velocity of the ball in the y-direction
ux = displacement of the ball in the x-direction
uy = displacement of the ball in the y-direction
t = time
m = mass of the ball
以下是与之相关的公式:
ax = -fx/m
ay = -fy/m
ax = dvx/dt = first derivative of vx w.r.t. time
ay = dvy/dt = first derivative of vy w.r.t. time
vx = dux/dt = first derivative of ux w.r.t. time
vy = duy/dt = first derivative of uy w.r.t. time
您需要初始条件:
ux = 0 at time = 0
uy = 0 at time = 0
vx = vx0 at time = 0; it's greater than zero if you shoot to the right
vy = vy0 at time = 0; it's greater than zero if you aim the cannon up
如果你替换它很容易解决:
d^2(ux)/dt^2 = -fx/m
d^2(uy)/dt^2 = -fy/m
整合一次w.r.t.时间:
dux/dt = -(fx/m)*t + c0
duy/dt = -(fy/m)*t + c1
再次整合以获得球的位置作为时间的函数:
ux = -(fx/m)*t^2/2 + c0*t + c3
uy = -(fy/m)*t^2/2 + c1*t + c4
您的初始条件有助于常数:
ux(0) = c3 = 0
uy(0) = c4 = 0
和
vx(0) = c0 = vx0
vy(0) = c1 = vy0
所以这里是你用初始速度(vx0,vx0)射入头风fx和重力fy之后质量球m位置的最终方程式:
ux = (vx0-(fx/m)*t/2)*t
uy = (vy0-(fy/m)*t/2)*t
您可以相对于任何起点(ux0,uy0)移动答案:
ux = ux0 + (vx0-(fx/m)*t/2)*t
uy = uy0 + (vy0-(fy/m)*t/2)*t
如果你从地平线以角度θ射击大炮,并且球具有初始速度v,则初始条件变为:
(vx0, vy0) = (v*cos(theta), v*sin(theta))
如果风很平静,这个解决方案仍然有效:只需设置fx = 0。
该解决方案假设头风是恒定的并且不是球的速度的函数。如果是,则方程是非线性的,你必须用数字求解它们。
正如评论中所指出的,你也可以使头风术语更加复杂。
通过包含更多物理效应,您可以使这些方程(及其解决方案)更复杂:
答案 1 :(得分:1)
你要去,因为你在谈论java,这里的方法几乎可以做你想要的,它做的是它计算射弹和运动的整个路径并显示(x,y)的每一步都有球,所以你可以将这些信息存储在一个数组中,并使用它们来计算路径并绘制它!
// constant for Earth's gravity acceleration in meters/second^2
public static final double ACCELERATION = -9.81;
// returns the displacement for a body under acceleration
public static double displacement(double v0, double t, double a) {
return v0 * t + 0.5 * a * t * t;
}
// prints a table showing the trajectory of an object given
// its initial velocity v and angle and number of steps
public static void table(double v0, double angle, int steps) {
double v0x = v0 * Math.cos(Math.toRadians(angle));
double v0y = v0 * Math.sin(Math.toRadians(angle));
double totalTime = -2.0 * v0y / ACCELERATION;
double dt = totalTime / steps;
System.out.println(" step x y time");
for (int i = 0; i <= steps; i++) {
double time = i * dt;
double x = i * v0x * dt;
double y = displacement(v0y, time, ACCELERATION);
System.out.printf("%8d%8.2f%8.2f%8.2f\n", i, x, y, time);
}
}