using System; using System.Threading.Tasks; using ThreatSource.Simulation; using ThreatSource.Data; using ThreatSource.Missile; namespace ThreatSource.Examples { /// /// 红外成像制导导弹仿真示例 /// 本示例展示了如何: /// 1. 创建和配置一个红外成像制导导弹 /// 2. 设置仿真环境和参数 /// 3. 运行仿真并获取结果 /// public class IRMissileSimulationExample { private ISimulationManager _simulationManager; private ThreatSourceDataManager _dataManager; public IRMissileSimulationExample() { _simulationManager = new SimulationManager(); _dataManager = new ThreatSourceDataManager(); } /// /// 运行红外成像制导导弹仿真示例 /// public async Task RunSimulationExample() { try { // 步骤1:初始化仿真管理器 _simulationManager.StartSimulation(0.02); // 20ms时间步长 // 步骤2:创建目标实体 var target = new BaseEquipment("target_001") { KState = new KinematicState { Position = new Vector3(5000, 0, 1000), // 5km距离,1km高度 Velocity = new Vector3(-50, 0, 0), // 50m/s向西移动 Orientation = new Orientation(0, 0, 0) } }; // 步骤3:从配置创建红外成像制导导弹 var missileData = _dataManager.GetMissile("IR_Missile_Example"); var missile = new InfraredImagingTerminalGuidanceMissile("missile_001", missileData) { KState = new KinematicState { Position = new Vector3(0, 0, 100), // 起始位置 Velocity = new Vector3(200, 0, 0), // 初始速度200m/s Orientation = new Orientation(0, 0, 0) // 初始朝向 } }; // 步骤4:注册实体到仿真管理器 _simulationManager.RegisterEntity(target); _simulationManager.RegisterEntity(missile); // 步骤5:订阅仿真事件 _simulationManager.Subscribe(OnMissileExplode); _simulationManager.Subscribe(OnFlightPhaseChange); // 步骤6:运行仿真循环 double simulationTime = 0; double maxTime = 60.0; // 最大仿真时间60秒 Console.WriteLine("开始红外成像制导导弹仿真..."); Console.WriteLine($"目标位置: {target.KState.Position}"); Console.WriteLine($"导弹初始位置: {missile.KState.Position}"); while (simulationTime < maxTime && missile.IsActive) { // 更新仿真 _simulationManager.UpdateSimulation(); simulationTime = _simulationManager.CurrentTime; // 每秒输出一次状态 if (simulationTime % 1.0 < 0.02) { var distance = Vector3.Distance(missile.KState.Position, target.KState.Position); Console.WriteLine($"时间: {simulationTime:F1}s, 距离目标: {distance:F1}m, 导弹阶段: {missile.FlightPhase}"); } await Task.Delay(1); // 避免阻塞 } // 步骤7:输出仿真结果 var finalDistance = Vector3.Distance(missile.KState.Position, target.KState.Position); Console.WriteLine($"仿真结束 - 最终距离: {finalDistance:F2}m"); if (finalDistance < 10.0) { Console.WriteLine("导弹成功命中目标!"); } else { Console.WriteLine("导弹未能命中目标。"); } } catch (Exception ex) { Console.WriteLine($"仿真过程出错: {ex.Message}"); } finally { // 清理资源 _simulationManager.StopSimulation(); } } /// /// 处理导弹爆炸事件 /// private void OnMissileExplode(MissileExplodeEvent evt) { Console.WriteLine($"导弹 {evt.SenderId} 在位置 {evt.Position} 爆炸"); } /// /// 处理飞行阶段变化事件 /// private void OnFlightPhaseChange(FlightPhaseChangeEvent evt) { Console.WriteLine($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段"); } } /// /// 示例程序入口点 /// public class Program { public static async Task Main(string[] args) { var example = new IRMissileSimulationExample(); await example.RunSimulationExample(); Console.WriteLine("按任意键退出..."); Console.ReadKey(); } } }