ActiveProtect/Models/InfraredTracker.cs

153 lines
5.0 KiB
C#

using System;
using ActiveProtect.SimulationEnvironment;
namespace ActiveProtect.Models
{
/// <summary>
/// 红外测角仪类
/// </summary>
public class InfraredTracker : SimulationElement
{
/// <summary>
/// 当前跟踪的导弹ID
/// </summary>
public string? TrackedMissileId { get; private set; }
/// <summary>
/// 目标ID
/// </summary>
public string? TargetId { get; private set; }
private readonly InfraredTrackerConfig config;
/// <summary>
/// 构造函数
/// </summary>
public InfraredTracker(string id, string targetId, InfraredTrackerConfig config, ISimulationManager manager)
: base(id, config.InitialPosition, config.InitialOrientation, 0, manager)
{
TargetId = targetId;
this.config = config;
}
/// <summary>
/// 更新红外测角仪状态
/// </summary>
public override void Update(double deltaTime)
{
if (!IsActive) return;
UpdateTracking();
}
/// <summary>
/// 更新跟踪状态
/// </summary>
private void UpdateTracking()
{
if (TrackedMissileId == null || TargetId == null) return;
var target = SimulationManager.GetEntityById(TargetId);
if (SimulationManager.GetEntityById(TrackedMissileId) is not InfraredCommandGuidedMissile missile || target == null) return;
// 计算导弹到测角仪的距离
double distanceToMissile = Vector3D.Distance(Position, missile.Position);
// 检查导弹是否在跟踪范围内
if (distanceToMissile <= config.MaxTrackingRange)
{
// 计算测角仪到导弹的向量
Vector3D trackerToMissile = missile.Position - Position;
// 计算测角仪到目标的向量
Vector3D trackerToTarget = target.Position - Position;
// 发送制导指令事件
PublishGuidanceCommandEvent(missile.Id, trackerToMissile, trackerToTarget, Id);
}
else
{
// 导弹超出跟踪范围,停止跟踪
StopTracking();
}
}
/// <summary>
/// 停止跟踪
/// </summary>
public void StopTracking()
{
TrackedMissileId = null;
TargetId = null;
}
/// <summary>
/// 发布制导指令事件
/// </summary>
private void PublishGuidanceCommandEvent(string missileId, Vector3D trackerToMissileVector, Vector3D trackerToTargetVector, string senderId)
{
var evt = new InfraredGuidanceCommandEvent
{
TargetMissileId = missileId,
TrackerToMissileVector = trackerToMissileVector,
TrackerToTargetVector = trackerToTargetVector,
SenderId = senderId
};
SimulationManager.PublishEvent(evt);
}
/// <summary>
/// 处理红外指令制导导弹点亮红外热源事件
/// </summary>
private void OnInfraredGuidanceMissileLight(InfraredGuidanceMissileLightEvent evt)
{
// 处理导弹点亮红外热源事件
TrackedMissileId ??= evt.SenderId;
}
/// <summary>
/// 处理红外指令制导导弹熄灭红外热源事件
/// </summary>
private void OnInfraredGuidanceMissileLightOff(InfraredGuidanceMissileLightOffEvent evt)
{
// 处理导弹熄灭红外热源事件
if (evt.SenderId == TrackedMissileId) StopTracking();
}
/// <summary>
/// 激活红外测角仪
/// </summary>
public override void Activate()
{
base.Activate();
SimulationManager.SubscribeToEvent<InfraredGuidanceMissileLightEvent>(OnInfraredGuidanceMissileLight);
SimulationManager.SubscribeToEvent<InfraredGuidanceMissileLightOffEvent>(OnInfraredGuidanceMissileLightOff);
}
/// <summary>
/// 销毁红外测角仪
/// </summary>
public override void Deactivate()
{
base.Deactivate();
SimulationManager.UnsubscribeFromEvent<InfraredGuidanceMissileLightEvent>(OnInfraredGuidanceMissileLight);
SimulationManager.UnsubscribeFromEvent<InfraredGuidanceMissileLightOffEvent>(OnInfraredGuidanceMissileLightOff);
}
/// <summary>
/// 获取红外测角仪状态
/// </summary>
public override string GetStatus()
{
return $"红外测角仪 {Id}:\n" +
$" 位置: {Position}\n" +
$" 跟踪导弹: {TrackedMissileId ?? ""}\n" +
$" 目标: {TargetId ?? ""}\n" +
$" 状态: {(IsActive ? "" : "")}\n";
}
}
}