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

Java 计算任意给定时间球的坐标(x,y),java,math,geometry,2d,Java,Math,Geometry,2d,我在二维空间中模拟一个球,画出它的路径 我使用g.fillOvalx,y,高度,宽度;抽签 球受三种力的影响:重力、风和击球力,它也有一个起始角 这幅画说明了我的意思 知道球从x=11开始y=360 我想根据球在给定时间的位置,在上述力的作用下,改变x和y的值 一个方程应该是这样的 x += Angle Power Gravity Wind y -= Angle Power Gravity Wind 编辑:我所说的射击威力是指初始速度。如果你学过物理,这个方程是众所周知的。这是2D中的牛顿定律

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

我使用g.fillOvalx,y,高度,宽度;抽签

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

这幅画说明了我的意思

知道球从x=11开始y=360

我想根据球在给定时间的位置,在上述力的作用下,改变x和y的值

一个方程应该是这样的

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

编辑:我所说的射击威力是指初始速度。

如果你学过物理,这个方程是众所周知的。这是2D中的牛顿定律:

sum(forces) = mass * acceleration
这实际上是三个方程,因为力、加速度、速度和位移都是矢量

您将通过假设二维来简化

在简化视图中,重力始终以负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

这里是质量为m的球的位置的最终方程,在你以初始速度vx0,vx0射入逆风fx和重力fy后:

您可以相对于任何起点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

该解决方案假设顶风是恒定的,不是球速度的函数。如果是,方程是非线性的,你必须用数值方法求解

正如在评论中所指出的,您也可以使逆风术语更加复杂

通过包含更多物理效果,可以使这些方程及其解更加复杂:


如果你学过物理,这个方程式是众所周知的。这是2D中的牛顿定律:

sum(forces) = mass * acceleration
这实际上是三个方程,因为力、加速度、速度和位移都是矢量

您将通过假设二维来简化

在简化视图中,重力始终以负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

这里是质量为m的球的位置的最终方程,在你以初始速度vx0,vx0射入逆风fx和重力fy后:

您可以相对于任何起点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

该解决方案假设逆风为co 它不是球的速度的函数。如果是,方程是非线性的,你必须用数值方法求解

正如在评论中所指出的,您也可以使逆风术语更加复杂

通过包含更多物理效果,可以使这些方程及其解更加复杂:


既然你说的是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);
    }
}

既然你说的是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);
    }
}

通常,在流速为v的气流中,静止物体上的力为C*v*| v |,其中C包含暴露表面、形状、雷诺数以及可能的其他一些因素。所以它在v中是二次的,不是常数。在所考虑的情况下,必须使用相对速度v,风速减去球的速度。因此,如果球以与风相同的方向和速度运动,则没有风力。如果风只应用于x坐标,这仍然是可积的。但为了一般性,使用数值积分。是的,我知道。我想我很清楚我的简化假设以及我为什么选择它们。op引用了射击能力,所以我认为完整的蒙蒂是不合适的。该解决方案假设顶风是恒定的,不是球速度的函数。如果是的话,这些方程是非线性的,你必须用数值方法求解它们我从来没有说过速度的线性函数,所以弱风对速度的y分量变化不大。对于vy>wy,仍然可以手动求解d/dt vy=-C*vy wy*| vy wy |为1/vyt-wy-1/vy0 wy=signvy0 wy*C*t,vyt=wy+vy0 wy/1+C*| vy0 wy | t,最后是yt=y0+wy*1/C*ln1+C*| vy0 wy*t*|通常,气流中静止物体上的力是以124v*v的速度流动,其中包含表面形状,雷诺数和其他一些可能的因素。所以它在v中是二次的,不是常数。在所考虑的情况下,必须使用相对速度v,风速减去球的速度。因此,如果球以与风相同的方向和速度运动,则没有风力。如果风只应用于x坐标,这仍然是可积的。但为了一般性,使用数值积分。是的,我知道。我想我很清楚我的简化假设以及我为什么选择它们。op引用了射击能力,所以我认为完整的蒙蒂是不合适的。该解决方案假设顶风是恒定的,不是球速度的函数。如果是的话,这些方程是非线性的,你必须用数值方法求解它们我从来没有说过速度的线性函数,所以弱风对速度的y分量变化不大。我们仍然可以手动求解d/dt vy=-C*vy*vy*| vy wy |对于vy>wy为1/vyt-wy-1/vy0 wy=signvy0 wy*C*t,vyt=wy+vy0 wy/1+C*| vy0 wy*t,最后是yt=y0+wy*t+signvy0 wy*1/C*ln1+C*| vy0 wy*t。