using ThreatSource.Simulation;
using ThreatSource.Guidance;
using ThreatSource.Utils;
using ThreatSource.Equipment;
namespace ThreatSource.Missile
{
///
/// 红外成像末制导导弹类,继承自基础导弹类
///
///
/// 该类提供了红外成像末制导导弹的完整实现:
/// - 继承自BaseMissile,具备基本的导弹功能
/// - 实现了红外成像制导系统
/// - 支持多阶段飞行控制
/// - 具备红外目标识别能力
/// - 提供精确的末制导打击能力
///
/// 工作流程:
/// 1. 导弹发射并进入发射阶段
/// 2. 切换到巡航阶段,进行中程飞行
/// 3. 进入末制导阶段,启动红外成像制导
/// 4. 接近目标后引爆或达到自毁条件后自毁
///
public class InfraredImagingTerminalGuidedMissile : BaseMissile
{
///
/// 红外成像末制导导弹的飞行阶段枚举
///
///
/// 定义了导弹的工作阶段:
/// - Launch: 发射阶段,初始加速
/// - Cruise: 巡航阶段,中程飞行
/// - TerminalSearch: 末制导搜索阶段,大视场角搜索目标
/// - TerminalTrack: 末制导跟踪阶段,小视场角精确跟踪
/// - TerminalLock: 末制导锁定阶段,目标确认后的精确跟踪
///
private enum IRTG_Stage
{
Launch, // 发射阶段
Cruise, // 巡航阶段
Terminal // 末制导
}
///
/// 导弹当前的飞行阶段
///
///
/// 用于控制导弹的行为状态
/// 在不同阶段执行不同的更新逻辑
///
private IRTG_Stage currentStage;
///
/// 红外成像制导系统实例
///
///
/// 负责处理红外图像信息
/// 计算制导指令
/// 控制导弹的飞行路径
///
private readonly InfraredImagingGuidanceSystem guidanceSystem;
///
/// 末制导开始距离,单位:米
///
///
/// 当导弹与目标的距离小于此值时
/// 导弹将进入末制导阶段
/// 启动红外成像制导系统
///
private const double TERMINAL_GUIDANCE_DISTANCE = 1000;
///
/// 初始化红外成像末制导导弹的新实例
///
/// 导弹ID
/// 目标类型
/// 导弹属性配置
/// 发射参数
/// 红外成像导引配置
/// 仿真管理器实例
///
/// 构造过程:
/// - 初始化基本属性
/// - 创建制导系统
/// - 配置制导参数
/// - 设置初始飞行阶段
///
public InfraredImagingTerminalGuidedMissile(
string missileId,
EquipmentType targetType,
MissileProperties properties,
KinematicState launchParams,
InfraredImagingGuidanceConfig guidanceConfig,
ISimulationManager manager)
: base(missileId, properties, launchParams, manager)
{
guidanceSystem = new InfraredImagingGuidanceSystem(
missileId + "_guidance",
missileId,
guidanceConfig,
targetType,
properties.MaxAcceleration,
properties.ProportionalNavigationCoefficient,
manager
);
}
///
/// 更新导弹的状态
///
/// 时间步长,单位:秒
///
/// 更新过程:
/// 1. 调用基类的更新方法
/// 2. 根据当前阶段选择更新方法
/// 3. 执行相应阶段的更新逻辑
/// 4. 检查是否需要自毁
///
public override void Update(double deltaTime)
{
switch (currentStage)
{
case IRTG_Stage.Launch:
UpdateLaunchStage(deltaTime);
break;
case IRTG_Stage.Cruise:
UpdateCruiseStage(deltaTime);
break;
case IRTG_Stage.Terminal:
UpdateTerminalStage(deltaTime);
break;
}
base.Update(deltaTime);
}
///
/// 更新发射阶段的状态
///
/// 时间步长,单位:秒
///
/// 发射阶段特点:
/// - 不使用制导加速度
/// - 仅依靠发动机推力
/// - 持续时间为1秒
/// - 结束后进入巡航阶段
///
private void UpdateLaunchStage(double deltaTime)
{
GuidanceAcceleration = Vector3D.Zero;
if (FlightTime > Properties.MaxEngineBurnTime)
{
currentStage = IRTG_Stage.Cruise;
}
}
///
/// 更新巡航阶段的状态
///
/// 时间步长,单位:秒
///
/// 巡航阶段特点:
/// - 保持稳定飞行
/// - 不使用制导系统
/// - 达到巡航时间后进入末制导搜索阶段
///
private void UpdateCruiseStage(double deltaTime)
{
// 如果巡航时间达到,切换到末制导搜索阶段
if (FlightTime > Properties.CruiseTime)
{
currentStage = IRTG_Stage.Terminal;
guidanceSystem.Activate();
}
}
///
/// 更新末制导搜索阶段的状态
///
/// 时间步长,单位:秒
///
/// 末制导阶段特点:
/// - 完全依赖导航系统的工作模式
/// - 根据导航系统状态更新制导
/// - 持续到命中目标
///
private void UpdateTerminalStage(double deltaTime)
{
guidanceSystem.Update(deltaTime);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
IsGuidance = guidanceSystem.HasGuidance;
}
///
/// 发射导弹
///
///
/// 发射过程:
/// - 调用基类发射方法
/// - 设置当前阶段为发射阶段
///
public override void Fire()
{
base.Fire();
currentStage = IRTG_Stage.Launch;
}
///
/// 激活导弹
///
///
/// 激活过程:
/// - 调用基类激活方法
/// - 激活制导系统
///
public override void Activate()
{
base.Activate();
guidanceSystem.Activate();
}
///
/// 停用导弹
///
///
/// 停用过程:
/// - 调用基类停用方法
/// - 停用制导系统
///
public override void Deactivate()
{
base.Deactivate();
guidanceSystem.Deactivate();
}
///
/// 获取导弹状态信息
///
/// 包含导弹状态的详细描述
///
/// 返回信息包括:
/// - 基本状态信息
/// - 当前飞行阶段
///
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["GuidanceSystem"] = guidanceSystem.GetStatusInfo();
return statusInfo;
}
}
}