C++ 弹道曲线问题

C++ 弹道曲线问题,c++,physics,C++,Physics,好的,我知道这对于程序员来说是一个非常离题的话题,但我仍然需要这个应用程序,所以它在这里: 弹道曲线(无风或任何其他条件)由以下两条线规定: 所以,有一个问题,你得到了3个未知值:x,y和时间t,但只有2个方程。 你不可能只用这些值来计算所有3个,我得到: 速度v 角α 原点坐标 因此,您必须决定指定哪一个 现在你们有了2D坦克游戏,或者类似的游戏,你们知道你们有坦克,你们必须用弹道来击落对手,设定角度和力量 我需要知道子弹什么时候击中地面,它可以在空中飞行,也可以预先计算。 我的问题来

好的,我知道这对于程序员来说是一个非常离题的话题,但我仍然需要这个应用程序,所以它在这里:

弹道曲线(无风或任何其他条件)由以下两条线规定:

所以,有一个问题,你得到了3个未知值:x,y和时间t,但只有2个方程。 你不可能只用这些值来计算所有3个,我得到:

  • 速度v
  • 角α
  • 原点坐标
因此,您必须决定指定哪一个

现在你们有了2D坦克游戏,或者类似的游戏,你们知道你们有坦克,你们必须用弹道来击落对手,设定角度和力量

我需要知道子弹什么时候击中地面,它可以在空中飞行,也可以预先计算。 我的问题来了。使用哪种方式?预先计算或检查每一步是否触地

若我想预先计算,我需要知道地形的高度,从逻辑上讲,它必须是恒定的,因为我不知道x坐标在哪个位置。如果我知道X,那就意味着我的炮塔前面就是墙。所以,当我落地的时候,唯一能得到结果的方法就是检查落地的时间间隔。这也是很好的,因为地形没有顶部是静态的耶!但是,这不是太大的开销,可以简单得多吗?你遇到过这样的问题/解决方案吗


提前感谢,顺便说一句,地形可以是平坦的,使用直线或NURBS,所以我请您提供一般解决方案,而不是具体的射击高度。您可以通过求解
t
的一个方程并代入另一个方程来计算投射物的路径
y(x)
。你得到


然后找到着陆点就是计算该函数和定义地形高度的函数之间的交点。一个交点将是发射点,另一个交点将是着陆点。(如果您的地形非常陡峭和丘陵,可能会有2个以上的交叉口,在这种情况下,您可以选择第一个大于启动点的交叉口。)您可以使用各种方法中的任何一种来实际计算交叉口;查看任何数学或游戏物理库的文档,看看它们是否提供了实现这一点的方法。

幸运的是,这是非常简单的运动学

这些方程是参数化的:对于任何给定的时间
t
,它们为您提供该时间的x和y坐标。你需要做的就是插入起始速度v和角度a

如果你在水平地面上工作,你的射弹返回地面的时间就是2sin(a)v/g,即速度的垂直分量除以重力引起的向下加速度。2是因为速度下降到0需要一段时间,然后同样的时间,它再次加速下降。一旦你知道你能解x的时间


如果你的地形不平坦,你会有一些额外的乐趣。你可以试着计算出在同一高度撞击地面的时间,然后修正额外的垂直距离。这也会改变你的水平距离,这可能会再次影响你的身高。。。但是两次或三次调整,误差将太小,以至于人类无法注意到:)

我不确定你这样做是否正确。你想要的主要方程式是。这是一个简单的一维方程,但它清楚地推广到了向量

实际上,si是你们的初始位置,vi是你们的初始速度,a是重力引起的加速度


为了使这项工作,建立一个完美的水平初速矢量,并将其投射到发射角上。那是你的vi。Si将是桶的顶端。大卫·扎斯拉夫斯基很好地回答了你关于方程求解的问题,但是如果你的最终目标是简单的弹道模拟,我建议你改用向量分解

通过利用向量分解,您可以导出射弹的x和y分量向量。然后,您可以将加速度应用于每个组件,以考虑重力、风等。然后,您可以更新作为时间函数的每个间隔的投射物(x,y)位置

例如:

double Speed = 100.0;     // Speed rather than velocity, as it is only the magnitude
double Angle = 30.0;      // Initial angle of 30º
doulbe Position[2] = {0.0,0.0};  // Set the origin to (0,0)

double xvelocity = Speed * Cos(Angle);
double yvelocity = Speed * Sin(Angle);
然后,如果您可以实现一个简单的更新函数,如下所示:

void Update(double Time)
{
     yvelocity = -9.8 * Time; // Apply gravity

     Position[0] *= (xvelocity * Time);  // update x position
     Position[1] *= (yvelocity * time);  // update y position

     CheckCollisions();  // check for collisions
}

当然,这是一个非常基本的例子,但你可以从这里开始构建。

连续函数不适合计算机,因为计算机是隐式离散的:浮点数/双数是离散的,计时器是离散的,游戏网格是离散的(即使它使用“双数”)

所以按照Justin Holdsclaw的建议离散方程。在每个方向上都有速度和加速度向量(在你的例子中是X和Y;你也可以加Z)。在每个刻度处更新所有矢量和对象在空间中的位置


请注意,结果不会是“精确的”。“delta”值(栅格粗糙度)越小,就越接近“精确”曲线。如果你感兴趣的话,可以找一本关于数值分析的书,阅读前几章,来精确地了解两者之间的关系。出于实际目的,你可以做一点实验。

我认为,你的最后一段几乎描述了牛顿的方法;-)我希望从他的坟墓轮换中获得能量。事实上,我在高中时获得了两项艾萨克·牛顿爵士物理学奖,但那是很久以前的事了,我懒得去查细节。此外,我不想用大量的方程式来压倒OP。在我的辩护中,出于效率的考虑,在游戏程序中使用quick-n-dirty快捷方式是一种习惯:)别误会我——我并没有说你的答案有任何问题!(我比你投了更高的票)只是给好奇的人指出一些东西。好吧,我现在明白了,这其实很简单。你们应该供应吗