计算任何给定时间球的坐标(x,y)

时间:2014-03-08 15:09:39

标签: java math geometry 2d

我正在二维空间中模拟一个球,画出它的路径。

我正在使用g.fillOval(x,y,height,width);来画球

球受到三种力的影响:重力,风力和击球力,它也有一个起始角度。

这张照片说明了我的意思

enter image description here

知道球从x=11 y=360

开始

我想在任何时间根据球的位置和所提到的力量改变x和y的值。

这样做的方程式应该是

x += Angle Power Gravity Wind
y -= Angle Power Gravity Wind

编辑:“射击力”是指初始速度。

2 个答案:

答案 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。

该解决方案假设头风是恒定的并且不是球的速度的函数。如果是,则方程是非线性的,你必须用数字求解它们。

正如评论中所指出的,你也可以使头风术语​​更加复杂。

通过包含更多物理效应,您可以使这些方程(及其解决方案)更复杂:

http://en.wikipedia.org/wiki/External_ballistics

答案 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);
    }
}