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

我正在做一个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 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