Math 二维弹丸轨迹澄清

Math 二维弹丸轨迹澄清,math,geometry,computational-geometry,trigonometry,projective-geometry,Math,Geometry,Computational Geometry,Trigonometry,Projective Geometry,2D游戏中的投射物追踪路径问题: 假设: 我们做了一个简化的假设,重力是恒定的,没有风或阻力。弹丸的运动由以下方程式给出: x=x0+v0t成本 y=y0+v0t辛瑟塔+0.5g t^2 其中x0,y0为初始位置,v0仅为初始速度大小,θ为放电角度,g为重力加速度。求解v0t的第一个方程并代入第二个方程,我们得到方程[1]: y=y0+x-x0 tantheta+0.5g/v0^2 x-x0^2/costheta^2 校准: 校准是从实际弹丸中确定g值的过程。要做到这一点,我们随机发射一枚射弹并

2D游戏中的投射物追踪路径问题:

假设:

我们做了一个简化的假设,重力是恒定的,没有风或阻力。弹丸的运动由以下方程式给出:

x=x0+v0t成本

y=y0+v0t辛瑟塔+0.5g t^2

其中x0,y0为初始位置,v0仅为初始速度大小,θ为放电角度,g为重力加速度。求解v0t的第一个方程并代入第二个方程,我们得到方程[1]:

y=y0+x-x0 tantheta+0.5g/v0^2 x-x0^2/costheta^2

校准:

校准是从实际弹丸中确定g值的过程。要做到这一点,我们随机发射一枚射弹并捕获:

起点x0,y0 目标向量v0,θ 曲线x1,y1上的随机点 将这些值代入方程[1]并求解g,我们得到:

g=v0^2*{[2 costheta^2 y1-y0/x1-x0^2]-[sin2theta/x1-x0]}

应用程序:

现在我们有了g,我们可以把它替换回方程[1],现在可以用它来追踪从任何起点和初始速度的投射物的路径。这是我不明白的部分

g=5.89

x0,y0起始位置=0,0

初始速度=1-100

放电角度=0-360

有人能解释一下,如果游戏中重力加速度为5.89,起始位置为0,0,那么对于1-100之间的任何初始速度,以及0-360之间的任何放电角度,如何获得抛物线的完整绘制路径吗

我是一个完全的数学新手,所有这些东西都不是我在别处找到的粗体字,我一直在绞尽脑汁。请假设我什么都不知道。

您只错过了第一组方程中的时间t和空间/时间约束,绘制投射物的第一个x秒或直到投射物离开边界框m。 所以伪代码应该是:

t=0;x0=某个坐标;y0=另一个坐标 环t t=t+1 计算坐标{Xt=1,Yt=1} 在该点和上一点之间绘制点或线 循环直到t>时间限制或点{Xt,Yt}在您的边界框之外 我希望这有助于您选择我们的v0=10和θ=60度

因此给出了方程读数x0=0,y0=0,g=5.89

y = 1.732*x - 0.1178*x^2
可直接绘制y与x的关系图:


注:我修正了重力的-符号。

这是一个相当简单的本科生物理问题。从x方向和y方向的牛顿定律开始:

在初始条件下:

式中,Q是弹丸的初始速度,θ是从地平线逆时针测量的角度,如果枪指向右侧

因此,如果每次w.r.t.积分一次,则得到:

应用初始条件:

第二次积分得到:

再次应用初始条件:

进行替换给出了您想要的最终方程式,即从火炮发射时起,弹丸的u,v位置:

如果将坐标系原点放在枪口出口处,则两个初始位移为零

现在你们有两个方程,关于射弹的u,v位置。你可以插入弹丸的初始速度和枪的角度,从地平线0开始测量,指向右边

您只需从时间为零开始,选择时间增量,然后循环任意长的时间间隔。将当前时间值插入这些方程,计算结果,增加时间,然后重复

让我们想象一下,你将枪与地平线成45度的逆时针角,以1000英寸/秒的速度发射一枚炮弹。你可以跨过时间,看到投射物沿着抛物线路径向上向右移动,直到到达顶点,然后开始回落到地平线。最终,你的y位移会回到零,然后继续进入负区域,就像你从悬崖边缘开枪一样

如果您想知道投射物在撞击地面前的距离,只需在高度小于或等于零时停止时间循环:

下面是一个Java实现:

package physics;

/**
 * CannonSimulator simulates shooting a projectile.  Users are responsible for making
 * sure that all constants use consistent units (e.g. meters for length, seconds for
 * time, kg for mass, etc.)
 * @author Michael
 * @since 6/14/12 9:47 PM
 * @link http://stackoverflow.com/questions/10935060/2d-projectile-tracing-path-clarification/11043389#11043389
 */
public class CannonSimulator {

    private double m;
    private double g;
    private double q;
    private double theta;

    public static void main(String[] args) {
        double m = ((args.length > 0) ? Double.valueOf(args[0]) : 1.0); // default mass is 1 kg
        double g = ((args.length > 1) ? Double.valueOf(args[1]) : 9.8); // default gravity is 9.8 m/sec^2
        double q = ((args.length > 2) ? Double.valueOf(args[2]) : 100.0); // default velocity is 100 m/sec
        double theta = ((args.length > 3 ? Double.valueOf(args[3]) : Math.PI/4.0)); // default angle is 45 degrees
        CannonSimulator simulator = new CannonSimulator(m, g, q, theta);
        double t = 0.0;
        double dt = 0.001; // time increment of 0.1 seconds
        while (simulator.v(t) >= 0.0) {
            System.out.println(String.format("time: %10.3f u: %10.3f v: %10.3f", t, simulator.u(t), simulator.v(t)));
            t += dt;
        }
    }

    public CannonSimulator(double m, double g, double q, double theta) {
        if (m <= 0.0) throw new IllegalArgumentException("mass must be greater than zero");
        if (g <= 0.0) throw new IllegalArgumentException("gravity must be greater than zero");
        if (q <= 0.0) throw new IllegalArgumentException("velocity must be greater than zero");

        this.m = m;
        this.g = g;
        this.q = q;
        this.theta = theta;
    }

    public double v(double time) {
        return time*(q*Math.sin(theta) - g*time/m);
    }

    public double u(double time) {
        return time*q*Math.cos(theta);
    }
}

这就是解决这个问题的方法。

我不确定我是否理解你的问题。在顶部,您给出了参数化路径方程,其中x和y是时间的函数,足以绘制投射物路径。你想得到抛物线本身的方程,也就是y作为x的函数吗?把你所有的常数都放到方程[1]中,剩下一个简单的yx二次函数。那么你的问题是什么?当然,你必须选择一个初始速度和一个放电角度,因为每个都会给你一个不同的路径。谢谢霍华德,看起来你知道你在说什么
但是,你能不能留下来帮我理解你在说什么?我照你说的做了,只给了你一个答案。我不明白,在给定一个初始速度和一个放电角的情况下,y的一个单一答案如何绘制抛物线?在将所有结果放入[1]之后,还有一个x变量,您没有指定x!,因此,你有一个函数方程yx=a*x^2+B*x+C,其中有一些常数a、B和C。因此你可以直接绘制yx,它显示路径。你所说的x变量是“起点”,对吗?你能给我一个抛物线的点,它符合上述标准,穿过x线或水平面,这样我就可以对你说的东西进行反向工程吗?当然,因为穿过x轴,意味着Yt=0,使用你的初始方程组,条件Y0=0,我们可以解t=-2*Vo*SinTheta/g,这意味着向下g0中的g,你得到了tantheta=1.732和costheta=0.5吗?如果你把60插入θ,比如tan60和cos60,我会得到不同的值。这似乎是因为在谷歌中输入tan60会给你错误的答案,但它与我的计算器一起工作,非常感谢!!
package physics;

/**
 * CannonSimulator simulates shooting a projectile.  Users are responsible for making
 * sure that all constants use consistent units (e.g. meters for length, seconds for
 * time, kg for mass, etc.)
 * @author Michael
 * @since 6/14/12 9:47 PM
 * @link http://stackoverflow.com/questions/10935060/2d-projectile-tracing-path-clarification/11043389#11043389
 */
public class CannonSimulator {

    private double m;
    private double g;
    private double q;
    private double theta;

    public static void main(String[] args) {
        double m = ((args.length > 0) ? Double.valueOf(args[0]) : 1.0); // default mass is 1 kg
        double g = ((args.length > 1) ? Double.valueOf(args[1]) : 9.8); // default gravity is 9.8 m/sec^2
        double q = ((args.length > 2) ? Double.valueOf(args[2]) : 100.0); // default velocity is 100 m/sec
        double theta = ((args.length > 3 ? Double.valueOf(args[3]) : Math.PI/4.0)); // default angle is 45 degrees
        CannonSimulator simulator = new CannonSimulator(m, g, q, theta);
        double t = 0.0;
        double dt = 0.001; // time increment of 0.1 seconds
        while (simulator.v(t) >= 0.0) {
            System.out.println(String.format("time: %10.3f u: %10.3f v: %10.3f", t, simulator.u(t), simulator.v(t)));
            t += dt;
        }
    }

    public CannonSimulator(double m, double g, double q, double theta) {
        if (m <= 0.0) throw new IllegalArgumentException("mass must be greater than zero");
        if (g <= 0.0) throw new IllegalArgumentException("gravity must be greater than zero");
        if (q <= 0.0) throw new IllegalArgumentException("velocity must be greater than zero");

        this.m = m;
        this.g = g;
        this.q = q;
        this.theta = theta;
    }

    public double v(double time) {
        return time*(q*Math.sin(theta) - g*time/m);
    }

    public double u(double time) {
        return time*q*Math.cos(theta);
    }
}