using ActiveProtect.SimulationEnvironment; using System; namespace ActiveProtect.Models { /// /// 激光指示器类,用于对目标进行激光照射 /// public class LaserDesignator : SimulationElement { /// /// 目标ID /// public string TargetId { get; private set; } /// /// 导弹ID /// public string MissileId { get; private set; } /// /// 干扰阈值(分贝) /// public double JammingThreshold { get; private set; } = 0.0; /// /// 是否被干扰 /// public bool IsJammed { get; private set; } = false; /// /// 是否正在照射 /// public bool IlluminationOn { get; private set; } = false; /// /// 激光功率 /// public double LaserPower { get; private set; } = 0; /// /// 激光发散角 /// public double LaserDivergenceAngle { get; private set; } = 0; /// /// 构造函数 /// /// 激光指示器ID /// 目标ID /// 导弹ID /// 激光指示器配置 /// 仿真管理器 public LaserDesignator(string id, string targetId, string missileId, double speed, LaserDesignatorConfig config, ISimulationManager simulationManager) : base(id, config.InitialPosition, new Orientation(), speed, simulationManager) { TargetId = targetId; MissileId = missileId; IsActive = false; IlluminationOn = false; LaserPower = config.LaserPower; LaserDivergenceAngle = config.LaserDivergenceAngle; } /// /// 更新激光指示器状态 /// /// 时间步长 public override void Update(double deltaTime) { if (IsActive && !IsJammed) { if (IlluminationOn) { PublishIlluminationUpdateEvent(); } } } /// /// 开始激光照射 /// private void StartLaserIllumination() { if (!IlluminationOn) { IlluminationOn = true; Console.WriteLine($"激光目标指示器 {Id} 开始照射目标 {TargetId}"); PublishIlluminationStartEvent(); } } /// /// 停止激光照射 /// private void StopLaserIllumination() { if (IlluminationOn) { IlluminationOn = false; Console.WriteLine($"激光目标指示器 {Id} 停止照射目标 {TargetId}"); PublishIlluminationStopEvent(); } } /// /// 处理激光干扰事件 /// /// 激光干扰事件 private void OnLaserJamming(LaserJammingEvent evt) { if (evt.TargetId == TargetId) { var tank = SimulationManager.GetEntityById(TargetId) as Tank; if (tank != null) { double distanceToTarget = Vector3D.Distance(Position, tank.Position); double jammingEffectiveness = 20 * Math.Log10(evt.JammingPower) - 20 * Math.Log10(distanceToTarget) - 20 * Math.Log10(4 * Math.PI); Console.WriteLine($"激光目标指示器 {Id} 收到干扰事件,干扰功率: {evt.JammingPower:F2}, 距离: {distanceToTarget:F2}, 干扰效果: {jammingEffectiveness:F2} dB, 阈值: {JammingThreshold:F2} dB"); if (jammingEffectiveness > JammingThreshold) { if (!IsJammed) { Console.WriteLine($"激光目标指示器 {Id} 被干扰,停止工作"); IsJammed = true; StopLaserIllumination(); } } else { if (IsJammed) { Console.WriteLine($"激光目标指示器 {Id} 干扰解除,恢复工作"); IsJammed = false; } } } } } /// /// 激活激光指示器 /// public override void Activate() { if (!IsActive) { IsActive = true; IsJammed = false; Console.WriteLine($"激光目标指示器 {Id} 已激活"); StartLaserIllumination(); SimulationManager.SubscribeToEvent(OnLaserJamming); SimulationManager.SubscribeToEvent(OnEntityDeactivatedEvent); } base.Activate(); } /// /// 停用激光指示器 /// public override void Deactivate() { if (IsActive) { IsActive = false; StopLaserIllumination(); Console.WriteLine($"激光目标指示器 {Id} 已停用"); SimulationManager.UnsubscribeFromEvent(OnLaserJamming); SimulationManager.UnsubscribeFromEvent(OnEntityDeactivatedEvent); } base.Deactivate(); } /// /// 发布激光照射事件 /// private void PublishIlluminationStartEvent() { var evt = new LaserIlluminationStartEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement }; PublishEvent(evt); Console.WriteLine($"激光指示器 {Id} 发布激光照射事件"); } /// /// 发布激光照射更新事件 /// private void PublishIlluminationUpdateEvent() { var evt = new LaserIlluminationUpdateEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement }; PublishEvent(evt); Console.WriteLine($"激光指示器 {Id} 发布激光照射更新事件"); } /// /// 发布激光照射停止事件 /// private void PublishIlluminationStopEvent() { var evt = new LaserIlluminationStopEvent { LaserDesignator = this, Target = SimulationManager.GetEntityById(TargetId) as SimulationElement }; PublishEvent(evt); Console.WriteLine($"激光指示器 {Id} 发布激光照射停止事件"); } /// /// 处理实体停用事件 /// /// 实体停用事件 private void OnEntityDeactivatedEvent(EntityDeactivatedEvent evt) { if (evt.DeactivatedEntityId == TargetId || evt.DeactivatedEntityId == MissileId) { StopLaserIllumination(); } } /// /// 获取激光指示器状态信息 /// /// 状态信息字符串 public override string GetStatus() { return $"激光目标指示器 {Id}:\n" + $" 位置: {Position}\n" + $" 目标: {TargetId}\n" + $" 导弹: {MissileId}\n" + $" 激活状态: {(IsActive ? "激活" : "未激活")}\n" + $" 照射状态: {(IlluminationOn ? "正在照射" : "未照射")}\n" + $" 干扰状态: {(IsJammed ? "被干扰" : "正常")}\n" + $" 激光功率: {LaserPower:E} W"; } } }