C 二维加速物体的截距计算
我正在做一个C程序,里面模拟了爱国者导弹系统。在这个模拟中,我的爱国者导弹必须捕获来袭的敌方目标导弹。 爱国者导弹和敌方目标的信息存储在如下结构中:C 二维加速物体的截距计算,c,simulation,collision,game-physics,intercept,C,Simulation,Collision,Game Physics,Intercept,我正在做一个C程序,里面模拟了爱国者导弹系统。在这个模拟中,我的爱国者导弹必须捕获来袭的敌方目标导弹。 爱国者导弹和敌方目标的信息存储在如下结构中: typedef struct _stat { float32_t x; float32_t y; float32_t v; // speed magnitude float32_t v_theta; // speed angle in radians float32_t a; // acceleration magni
typedef struct _stat {
float32_t x;
float32_t y;
float32_t v; // speed magnitude
float32_t v_theta; // speed angle in radians
float32_t a; // acceleration magnitude
float32_t a_theta; // acceleration angle in radians
} stat;
uint8_t computeIntercept(stat t, stat p, float32_t *theta);
我将信息存储在两个全局变量中,如下所示:
stat t_stat; // target stats
stat p_stat; // patriot stats
现在,为了简化问题,目标由于初始速度而移动,并且仅受重力影响,因此我们可以考虑:
t_stat.x = TARGET_X0;
t_stat.y = TARGET_Y0;
t_stat.v = TARGET_V0;
t_stat.v_theta = TARGET_V_THETA0;
t_stat.a = G; // gravity acceleration
t_stat.a_theta = -(PI / 2);
同样,为了简化,我也在考虑计算爱国者达到最高速度时的碰撞点,所以它自身的加速度只用于平衡重力加速度。我们特别:
p_stat.x = PATRIOT_X0;
p_stat.y = PATRIOT_Y0;
p_stat.v = 1701,45; // Mach 5 speed in m/s
p_stat.v_theta = ???? // that's what I need to find
p_stat.a = G; // gravity acceleration
p_stat.a_theta = PI / 2;
< P >这样,我们可以认为爱国者以恒定速度移动,因为受影响的加速度之和等于0。
float32_t patr_ax = p_stat.a * cos(p_stat.a_theta); // = 0
float32_t patr_ay = p_stat.a * sin(p_stat.a_theta) - G; // = 0
现在,问题来了。我想写一个函数来计算右p_stat.v_theta
,以便击中目标(如果可能发生碰撞)
例如,我需要的函数可以有这样一个原型:
typedef struct _stat {
float32_t x;
float32_t y;
float32_t v; // speed magnitude
float32_t v_theta; // speed angle in radians
float32_t a; // acceleration magnitude
float32_t a_theta; // acceleration angle in radians
} stat;
uint8_t computeIntercept(stat t, stat p, float32_t *theta);
它可以这样使用:
if(computeIntercept(t_stat, p_stat, &p_stat.v_theta)) {
printf("Target Hit with an angle of %.2f\n", p_stat.v_theta);
} else {
printf("Target Missed!\n");
}
为了让它更清楚,这里是我想要的图像
为了发生碰撞,需要两个对象的坐标在同一时刻相同 您可以将问题分解为两个更简单的问题,分别考虑x轴和y轴: 您需要计算这两个对象的运动方程,一个用于它们的水平分量,一个用于它们的垂直分量 检查两个对象的解是否包含相等的坐标,以及这是否发生在同一时刻 目标坐标:T(xt,yt) 爱国者坐标:p(xp,yp) 您可以通过改变时间
t
,并观察:t==p
,从数值上解决这个问题
在您的情况下,其中一个方程式应该包含一个用于说明角度θ的参数。您的目标弹丸以恒定加速度移动,因此速度可以描述为 现在积分这个方程,得到位置方程 现在通过知道初始位置,我们可以确定这个常数向量是初始位置 现在目标弹丸的位置终于确定了 这是两个方程式(用于x和y坐标)。y的方程是二次方程,x的方程是线性方程,因为加速度(重力)在垂直方向 你有 一般来说,您应该这样做: 你可以用
为了解你得到的θ的最后一个方程。模拟事件,找出两个物体最接近的时间
导弹只能在发射后飞行这么长时间(使其无法进入轨道),让它成为
tf
为每个对象使用struct\u stat
,编写一个函数,报告给定t
和对象的x,y
以合理的间隔(1s?)模拟两个对象之间距离的平方
从最近接近的时间t
开始,使用它两个相邻的t-dt
和t+dt
重新进行模拟。可以使用小于10倍的dt
或其他方法,从t-dt
到t+dt
使用时间
重复上述步骤,直到距离足够近或dt
足够小
如果此距离足够小,则在确定时间后,评估所需数据的struct\u stat
注:
pt2 compute\u position(struct\u stat st,time t)
的复杂性细节只需要考虑初始dt
估计值。意思是,你需要检查它是否击中目标,在哪个角度?不,如果可能,我想找到它击中目标的角度,如果存在,它是目标的速度矢量,而vp
是爱国者的速度矢量。那么目标是朝哪个方向移动的?图中显示的vt
矢量是目标的初始速度矢量,然后,当模拟开始时,由于重力加速度,其方向和大小将发生变化。而vp
向量一旦计算出theta
角度,其方向和大小应保持不变。我希望我已经澄清了这个问题。谢谢你的回答。我认为在二次方程中有一个输入错误,最后一项应该乘以t^2,不是吗?不管怎样,你说的“爱国者达到最高地位的时间”是什么意思?如果爱国者的vx
和vy
都未知,我怎么能找到时间“t”?我编辑了我的答案,给了你一个例子,你应该如何得到你需要的角度方程。“爱国者到达其最高位置的时间”是对你的问题的误解。我认为爱国者也由于重力而向下加速,你希望碰撞发生在这一点上。但是你说你想计算爱国者达到最高速度时的碰撞,我不太明白你的意思,因为你假设他身上的总加速度是0,这意味着他的速度是恒定的。在任何情况下,只要两个弹丸的加速度都是恒定的,我的答案应该是有效的。好的,谢谢,我以前写的东西有点让人困惑。不管怎样,你可以看到爱国者的运动分为两个不同的阶段,最初它有自己的加速度矢量,可以提高速度,然后当它达到最高速度时,加速度在保持速度恒定的点上减小。我的问题是在第一阶段结束时计算的,在这个w