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; } } }