using System; using System.Collections.Generic; using System.Threading; using System.Linq; using System.Diagnostics; using ThreatSource.Missile; using ThreatSource.Simulation; using ThreatSource.Utils; using ThreatSource.Jamming; using ThreatSource.Sensor; using ThreatSource.Target; using ThreatSource.Guidance; using ThreatSource.Indicator; namespace ThreatSource.Tools.MissileSimulation { /// /// 综合导弹模拟器 - 支持6种不同类型的导弹模拟 /// public class ComprehensiveMissileSimulator { // 定义仿真结束事件 public event EventHandler? SimulationEnded; private readonly ISimulationManager simulationManager; private readonly Dictionary missiles; private readonly Dictionary targets; private readonly Dictionary sensors; private Dictionary missileActiveStatus; private readonly double timeStep = 0.01; // 时间步长,单位:秒 /// /// 初始化综合导弹模拟器 /// public ComprehensiveMissileSimulator() { simulationManager = new SimulationManager(); missiles = new Dictionary(); targets = new Dictionary(); sensors = new Dictionary(); missileActiveStatus = new Dictionary(); InitializeSimulation(); } /// /// 初始化仿真环境 /// private void InitializeSimulation() { // 添加目标(坦克) AddTarget("Tank_1", new Vector3D(0, 0, 0)); // 添加各种类型的导弹 AddLaserSemiActiveMissile(); AddLaserBeamRiderMissile(); AddTerminalSensitiveMissile(); AddInfraredCommandMissile(); AddInfraredImagingMissile(); AddMillimeterWaveMissile(); // 添加各种传感器和指示器 AddSensorsAndDesignators(); // 初始化所有导弹的激活状态为false foreach (var missile in missiles.Keys) { missileActiveStatus[missile] = false; missiles[missile].Activate(); // 激活导弹,但不会更新状态 } } /// /// 添加目标 /// private void AddTarget(string targetId, Vector3D position) { var target = new Tank(targetId, position, 0, simulationManager) { Position = position }; targets[targetId] = target; simulationManager.RegisterEntity(targetId, target); target.Activate(); // 添加这行,激活目标 Console.WriteLine($"添加目标 {targetId},位置:{position}"); } /// /// 添加激光半主动制导导弹 /// private void AddLaserSemiActiveMissile() { var properties = new MissileProperties { Id = "LSGM_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 800, MaxFlightTime = 10, MaxFlightDistance = 5000, MaxAcceleration = 400, InitialPosition = new Vector3D(2000, 100, 100), InitialSpeed = 700, InitialOrientation = new Orientation(Math.PI, -0.05, 0), ProportionalNavigationCoefficient = 3, SelfDestructHeight = 0, Type = MissileType.LaserSemiActiveGuidance }; var missile = new LaserSemiActiveGuidedMissile(properties, simulationManager); missiles["LSGM_1"] = missile; simulationManager.RegisterEntity("LSGM_1", missile); Console.WriteLine($"注册激光半主动导弹 LSGM_1"); } /// /// 添加激光驾束制导导弹 /// private void AddLaserBeamRiderMissile() { var properties = new MissileProperties { Id = "LBRM_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 400, MaxFlightTime = 10, MaxFlightDistance = 3000, MaxAcceleration = 400, InitialPosition = new Vector3D(2000, 10, 100), InitialSpeed = 300, InitialOrientation = new Orientation(Math.PI, 0.0, 0.0), ProportionalNavigationCoefficient = 3, SelfDestructHeight = 0, Type = MissileType.LaserBeamRiderGuidance }; var missile = new LaserBeamRiderMissile(properties, simulationManager); missiles["LBRM_1"] = missile; simulationManager.RegisterEntity("LBRM_1", missile); Console.WriteLine($"注册激光束骑导弹 LBRM_1"); } /// /// 添加末敏弹 /// private void AddTerminalSensitiveMissile() { var properties = new MissileProperties { Id = "TSM_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 1000, MaxFlightTime = 100, MaxFlightDistance = 5000, MaxAcceleration = 200, InitialPosition = new Vector3D(3000, 0, 0), InitialSpeed = 800, InitialOrientation = new Orientation(Math.PI, 0, 0), SelfDestructHeight = 0, Type = MissileType.TerminalSensitiveMissile }; var submunitionProperties = new MissileProperties { MaxSpeed = 2000, MaxFlightTime = 60, MaxFlightDistance = 2000, MaxAcceleration = 300, ProportionalNavigationCoefficient = 4, Mass = 10, ExplosionRadius = 5, HitProbability = 0.9, SelfDestructHeight = 20, Type = MissileType.TerminalSensitiveSubmunition }; var missile = new TerminalSensitiveMissile("Tank_1", properties, submunitionProperties, 1, simulationManager); missiles["TSM_1"] = missile; simulationManager.RegisterEntity("TSM_1", missile); Console.WriteLine($"注册末敏导弹 TSM_1"); } /// /// 添加红外指令制导导弹 /// private void AddInfraredCommandMissile() { var properties = new MissileProperties { Id = "ICGM_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 400, MaxFlightTime = 60, MaxFlightDistance = 2100, MaxAcceleration = 100, InitialPosition = new Vector3D(2000, 10, 100), InitialSpeed = 300, InitialOrientation = new Orientation(Math.PI, 0.0, 0), ProportionalNavigationCoefficient = 3, SelfDestructHeight = 0, Type = MissileType.InfraredCommandGuidance }; var missile = new InfraredCommandGuidedMissile(properties, simulationManager); missiles["ICGM_1"] = missile; simulationManager.RegisterEntity("ICGM_1", missile); Console.WriteLine($"注册红外指令导弹 ICGM_1"); } /// /// 添加红外成像末制导导弹 /// private void AddInfraredImagingMissile() { var properties = new MissileProperties { Id = "ITGM_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 400, MaxFlightTime = 60, MaxFlightDistance = 5000, MaxAcceleration = 50, InitialPosition = new Vector3D(2000, 20, 100), InitialSpeed = 300, InitialOrientation = new Orientation(Math.PI, 0.0, 0), SelfDestructHeight = 0, ProportionalNavigationCoefficient = 3, Type = MissileType.InfraredImagingTerminalGuidance }; var missile = new InfraredImagingTerminalGuidedMissile(properties, simulationManager); missiles["ITGM_1"] = missile; simulationManager.RegisterEntity("ITGM_1", missile); Console.WriteLine($"注册红外成像导弹 ITGM_1"); } /// /// 添加毫米波末制导导弹 /// private void AddMillimeterWaveMissile() { var properties = new MissileProperties { Id = "MMWG_1", Mass = 50, ExplosionRadius = 5, MaxSpeed = 400, MaxFlightTime = 60, MaxFlightDistance = 5000, MaxAcceleration = 50, InitialPosition = new Vector3D(2000, 200, 100), InitialSpeed = 300, InitialOrientation = new Orientation(Math.PI, 0.0, 0), SelfDestructHeight = 0, ProportionalNavigationCoefficient = 3, Type = MissileType.MillimeterWaveTerminalGuidance }; var missile = new MillimeterWaveTerminalGuidedMissile(properties, simulationManager); missiles["MMWG_1"] = missile; simulationManager.RegisterEntity("MMWG_1", missile); Console.WriteLine($"注册毫米波导弹 MMWG_1"); } /// /// 添加传感器和指示器 /// private void AddSensorsAndDesignators() { // 添加激光目标指示器 var laserDesignator = new LaserDesignator( "LD_1", "Tank_1", "LSGM_1", 0, new LaserDesignatorConfig { Id = "LD_1", InitialPosition = new Vector3D(2000, 150, 100), LaserPower = 1000, LaserDivergenceAngle = 0.001 }, simulationManager ); sensors["LD_1"] = laserDesignator; simulationManager.RegisterEntity("LD_1", laserDesignator); Console.WriteLine("注册激光目标指示器 LD_1"); // 添加激光驾束仪 var laserBeamRider = new LaserBeamRider( "LBR_1", "LBRM_1", "Tank_1", 0, new LaserBeamRiderConfig { Id = "LBR_1", InitialPosition = new Vector3D(2000, 10, 100), LaserPower = 1000, ControlFieldDiameter = 6 }, simulationManager ); sensors["LBR_1"] = laserBeamRider; simulationManager.RegisterEntity("LBR_1", laserBeamRider); Console.WriteLine("注册激光驾束仪 LBR_1"); // 添加红外测角仪 var infraredTracker = new InfraredTracker( "IT_1", "Tank_1", new InfraredTrackerConfig { Id = "IT_1", InitialPosition = new Vector3D(2000, 0, 100), InitialOrientation = new Orientation(Math.PI, 0, 0), MaxTrackingRange = 10000, FieldOfView = Math.PI / 4, AngleMeasurementAccuracy = 0.0005, UpdateFrequency = 100 }, simulationManager ); sensors["IT_1"] = infraredTracker; simulationManager.RegisterEntity("IT_1", infraredTracker); Console.WriteLine("注册红外测角仪 IT_1"); } /// /// 选择要激活的导弹 /// public void SelectMissile(string missileId) { if (!missiles.ContainsKey(missileId)) { Console.WriteLine($"错误:找不到导弹 {missileId}"); return; } // 先停用所有导弹和传感器 foreach (var id in missiles.Keys) { missileActiveStatus[id] = false; missiles[id].Deactivate(); } foreach (var sensor in sensors.Values) { sensor.Deactivate(); } // 激活选中的导弹 missileActiveStatus[missileId] = true; missiles[missileId].Activate(); Console.WriteLine($"已选择导弹:{missileId}"); // 确保所有目标都处于激活状态 foreach (var target in targets.Values) { target.Activate(); Console.WriteLine($"确保目标 {target.Id} 处于激活状态"); } // 激活相关的传感器和指示器 ActivateRelatedSensors(missileId); // 打印所有注册的组件 PrintSimulationRegisteredComponents(); } /// /// 激活与导弹相关的传感器和指示器 /// private void ActivateRelatedSensors(string missileId) { // 根据导弹类型激活相应的传感器 switch (missileId) { case "LSGM_1": // 激光半主动制导导弹 if (sensors.ContainsKey("LD_1")) { sensors["LD_1"].Activate(); } break; case "LBRM_1": // 激光驾束制导导弹 if (sensors.ContainsKey("LBR_1")) { sensors["LBR_1"].Activate(); } break; case "ICGM_1": // 红外指令制导导弹 case "ITGM_1": // 红外成像末制导导弹 if (sensors.ContainsKey("IT_1")) { sensors["IT_1"].Activate(); } break; case "TSM_1": // 末敏弹 case "MMWG_1": // 毫米波末制导导弹 // 这些导弹使用自身的传感器系统 break; } } /// /// 应用干扰 /// public void ApplyJamming(JammingType type, double power, double duration, Vector3D position) { var jammingParams = new JammingParameters { Type = type, Power = power, Duration = duration, Direction = new Vector3D(1, 0, 0) }; foreach (var missile in missiles.Values) { if (missile is BaseMissile actualMissile) { // 获取导弹内部的传感器 var infraredDetector = actualMissile.GetType().GetField("infraredDetector", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as InfraredDetector; var radiometer = actualMissile.GetType().GetField("radiometer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveRadiometer; var rangefinder = actualMissile.GetType().GetField("rangefinder", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as LaserRangefinder; var altimeter = actualMissile.GetType().GetField("altimeter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveAltimeter; switch (type) { case JammingType.Infrared: infraredDetector?.ApplyJamming(jammingParams); break; case JammingType.MillimeterWave: radiometer?.ApplyJamming(jammingParams); altimeter?.ApplyJamming(jammingParams); break; case JammingType.Laser: rangefinder?.ApplyJamming(jammingParams); break; } } } } /// /// 清除干扰 /// public void ClearJamming(JammingType type) { var jammingParams = new JammingParameters { Type = type, Power = 0, Duration = 0, Direction = new Vector3D(1, 0, 0) }; foreach (var missile in missiles.Values) { if (missile is BaseMissile actualMissile) { // 获取导弹内部的传感器 var infraredDetector = actualMissile.GetType().GetField("infraredDetector", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as InfraredDetector; var radiometer = actualMissile.GetType().GetField("radiometer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveRadiometer; var rangefinder = actualMissile.GetType().GetField("rangefinder", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as LaserRangefinder; var altimeter = actualMissile.GetType().GetField("altimeter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(actualMissile) as MillimeterWaveAltimeter; switch (type) { case JammingType.Infrared: infraredDetector?.ClearJamming(type); break; case JammingType.MillimeterWave: radiometer?.ClearJamming(type); altimeter?.ClearJamming(type); break; case JammingType.Laser: rangefinder?.ClearJamming(type); break; } } } } /// /// 开始模拟 /// public void Start() { Console.WriteLine("开始综合导弹模拟..."); // 确保所有激活的导弹和传感器都处于正确状态 foreach (var missile in missiles.Values) { if (missileActiveStatus[missile.Id]) { missile.Activate(); } } // 确保所有目标都处于激活状态 foreach (var target in targets.Values) { target.Activate(); Console.WriteLine($"激活目标:{target.Id}"); } // 打印仿真开始前的组件状态 PrintSimulationRegisteredComponents(); // 启动仿真系统 simulationManager.StartSimulation(timeStep); while (simulationManager.State == SimulationState.Running) { // 让仿真管理器统一处理所有实体的更新 simulationManager.Update(timeStep); // 检查是否还有活跃的导弹 var activeMissiles = simulationManager.GetEntitiesByType() .Where(m => m.IsActive); if (!activeMissiles.Any()) { simulationManager.StopSimulation(); SimulationEnded?.Invoke(this, EventArgs.Empty); ResetSimulation(); break; } // 打印状态 PrintSimulationStatus(); Thread.Sleep((int)(timeStep * 1000)); } } /// /// 打印仿真状态 /// private void PrintSimulationStatus() { // 打印所有活跃导弹的状态 var activeMissiles = simulationManager.GetEntitiesByType() .Where(m => m.IsActive); foreach (var missile in activeMissiles) { Console.WriteLine("\n========== 导弹状态 =========="); Console.WriteLine(missile.GetStatus()); } // 打印目标状态 foreach (var target in targets.Values) { Console.WriteLine("\n========== 目标状态 =========="); Console.WriteLine($"目标ID: {target.Id}"); Console.WriteLine($"位置: {target.Position}"); if (target is Tank tank) { Console.WriteLine($"朝向: {tank.Orientation}"); } } // 打印激活的传感器状态 foreach (var sensor in sensors.Values.Where(s => s.IsActive)) { Console.WriteLine("\n========== 传感器状态 =========="); Console.WriteLine(sensor.GetStatus()); } } /// /// 停止模拟 /// public void Stop() { simulationManager.StopSimulation(); Console.WriteLine("模拟结束"); } /// /// 暂停模拟 /// public void Pause() { simulationManager.PauseSimulation(); Console.WriteLine("模拟暂停"); } /// /// 恢复模拟 /// public void Resume() { simulationManager.ResumeSimulation(); Console.WriteLine("模拟恢复"); } /// /// 重置仿真状态 /// public void ResetSimulation() { // 获取所有活跃的导弹 var activeMissiles = simulationManager.GetEntitiesByType(); foreach (var missile in activeMissiles) { // 获取导弹的初始属性 var properties = missile.GetType().GetField("properties", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(missile) as MissileProperties; if (properties != null) { // 重置导弹位置和状态 missile.Position = properties.InitialPosition; missile.Velocity = Vector3D.Zero; } missile.Deactivate(); } // 重置所有传感器状态 var activeSensors = simulationManager.GetEntitiesByType() .Where(e => sensors.ContainsValue(e)); foreach (var sensor in activeSensors) { sensor.Deactivate(); } // 重置所有目标状态 var activeTargets = simulationManager.GetEntitiesByType(); foreach (var target in activeTargets) { var initialPosition = target.Position; target.Deactivate(); target.Position = initialPosition; target.Activate(); } // 重置导弹激活状态 missileActiveStatus.Clear(); foreach (var missile in missiles.Values) { missileActiveStatus[missile.Id] = false; } Console.WriteLine("仿真状态已重置"); } /// /// 打印所有注册到仿真管理器中的组件 /// public void PrintSimulationRegisteredComponents() { Console.WriteLine("\n========== 仿真管理器中的注册组件 =========="); var allEntities = simulationManager.GetAllEntities(); foreach (var entity in allEntities) { if (entity is SimulationElement simElement) { Console.WriteLine($"{simElement.Id} ({entity.GetType().Name})"); } else { Console.WriteLine($"未知组件 ({entity.GetType().Name})"); } } Console.WriteLine($"总计: {allEntities.Count()} 个组件"); } /// /// 获取当前活动的传感器列表 /// public (string Id, string Name, bool IsActive)[] GetActiveSensors() { return sensors.Select(s => ( s.Value.Id, GetSensorDisplayName(s.Value), s.Value.IsActive )).ToArray(); } /// /// 获取传感器的显示名称 /// private string GetSensorDisplayName(SimulationElement sensor) { return sensor switch { LaserDesignator _ => "激光目标指示器", LaserBeamRider _ => "激光驾束仪", InfraredTracker _ => "红外测角仪", _ => sensor.Id }; } /// /// 切换传感器的激活状态 /// public void ToggleSensor(string sensorId) { if (sensors.TryGetValue(sensorId, out var sensor)) { if (sensor.IsActive) sensor.Deactivate(); else sensor.Activate(); Console.WriteLine($"传感器 {GetSensorDisplayName(sensor)} 已{(sensor.IsActive ? "激活" : "停用")}"); } } } }