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