using System; using System.Collections.Generic; using ActiveProtect.Simulation; using ActiveProtect.Utility; namespace ActiveProtect.Models { /// /// 表示仿真中的导弹 /// public class MissileBase : SimulationElement { /// /// 当前飞行时间(秒) /// public double FlightTime { get; protected set; } /// /// 当前飞行距离(米) /// public double FlightDistance { get; protected set; } /// /// 当前发动机燃烧时间(秒) /// public double EngineBurnTime { get; protected set; } /// /// 是否有制导 /// public bool HasGuidance { get; protected set; } /// /// 失去制导的时间(秒) /// protected double LostGuidanceTime { get; set; } = 0; /// /// 最后已知的速度向量 /// protected Vector3D LastKnownVelocity = Vector3D.Zero; /// /// 制导加速度 /// protected Vector3D GuidanceAcceleration { get; set; } /// /// 推力加速度 /// protected Vector3D ThrustAcceleration { get; set; } /// /// 导弹固定配置参数 /// public readonly MissileProperties MissileProperties; /// /// 构造函数 /// public MissileBase(MissileProperties properties, ISimulationManager manager) : base(properties.Id, properties.InitialPosition, properties.InitialOrientation, properties.InitialSpeed, manager) { MissileProperties = properties; SimulationManager = manager; IsActive = false; HasGuidance = false; FlightTime = 0; FlightDistance = 0; EngineBurnTime = 0; GuidanceAcceleration = Vector3D.Zero; ThrustAcceleration = Vector3D.Zero; } /// /// 更新导弹状态 /// public override void Update(double deltaTime) { if (IsActive) { // 更新导弹运动状态 UpdateMotionState(deltaTime); } } protected virtual void UpdateMotionState(double deltaTime) { //Vector3D acceleration = CalculateAcceleration(Velocity); Vector3D acceleration = GuidanceAcceleration; if (HasGuidance) { // 制导条件下,使用四阶龙格-库塔方法更新导弹的位置和速度 (Position, Velocity) = MotionAlgorithm.RungeKutta4(deltaTime, Position, Velocity, acceleration); } else { // 无制导条件下,使用运动学方程更新导弹的位置和速度 (Position, Velocity) = MotionAlgorithm.CalculateBallisticMotion(Position, Velocity, acceleration, deltaTime); } // 限制速度不超过最大速度 if (Velocity.Magnitude() > MissileProperties.MaxSpeed) { Velocity = Velocity.Normalize() * MissileProperties.MaxSpeed; } Speed = Velocity.Magnitude(); Orientation = Orientation.FromVector(Velocity); // 添加高斯噪声(测试用,用于测试运动中概率的影响) // Position = MotionAlgorithm.AddRandomPerturbation(Position); // Velocity = MotionAlgorithm.AddRandomPerturbation(Velocity); FlightTime += deltaTime; FlightDistance += Speed * deltaTime; //DistanceToTarget = Vector3D.Distance(Position, SimulationManager.GetEntityById(MissileProperties.TargetId).Position); } /// /// 计算导弹的加速度 /// private Vector3D CalculateAcceleration(Vector3D velocity) { // 计算空气阻力的影响 Vector3D dragAcceleration = velocity.Normalize() * -1 * CalculateDrag(velocity.Magnitude()) / MissileProperties.Mass; Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration; Console.WriteLine($"导弹 {Id} 的加速度: {totalAcceleration}, 制导加速度: {GuidanceAcceleration}, 推力加速度: {ThrustAcceleration}, 空气阻力加速度: {dragAcceleration}"); if (totalAcceleration.Magnitude() > MissileProperties.MaxAcceleration) { totalAcceleration = totalAcceleration.Normalize() * MissileProperties.MaxAcceleration; } return totalAcceleration; } /// /// 计算空气阻力 /// private static double CalculateDrag(double speed) { const double dragCoefficient = 0.1; // 减小阻力系数 const double airDensity = 1.225; // 海平面空气密度,kg/m^3 const double referenceArea = 0.01; // 减小导弹的参考面积,m^2 return 0.5 * dragCoefficient * airDensity * referenceArea * speed * speed; } /// /// 检查是否应该自毁 /// protected bool ShouldSelfDestruct() { if (FlightTime >= MissileProperties.MaxFlightTime) { Console.WriteLine($"导弹 {Id} 超出最大飞行时间 ({FlightTime:F2}/{MissileProperties.MaxFlightTime:F2}),准备自毁"); return true; } if (FlightDistance >= MissileProperties.MaxFlightDistance) { Console.WriteLine($"导弹 {Id} 超出最大飞行距离 ({FlightDistance:F2}/{MissileProperties.MaxFlightDistance:F2}),准备自毁"); return true; } if (Position.Y <= -1.0) // 数字略小于0 { Console.WriteLine($"导弹 {Id} 高度小于等于0 ({Position.Y:F2}),准备自毁"); return true; } return false; } /// /// 更新发动机燃烧时间 /// // private void UpdateEngineBurnTime(double deltaTime) // { // if (CurrentStage == FlightStage.Acceleration && EngineBurnTime < MaxEngineBurnTime) // { // EngineBurnTime += deltaTime; // } // } /// /// 导弹爆炸 /// protected virtual void Explode() { Deactivate(); } public override void Activate() { base.Activate(); SimulationManager.SubscribeToEvent(OnTargetHitEvent); } public override void Deactivate() { base.Deactivate(); SimulationManager.UnsubscribeFromEvent(OnTargetHitEvent); } /// /// 处理目标被击中事件 /// private void OnTargetHitEvent(TargetHitEvent eventData) { if (eventData.MissileId == Id) { Explode(); } } /// /// 导弹自毁 /// public void SelfDestruct() { if (IsActive) { string reason = FlightTime >= MissileProperties.MaxFlightTime ? "超出最大飞行时间" : FlightDistance >= MissileProperties.MaxFlightDistance ? "超出最大飞行距离" : Position.Y <= 0 ? "高度小于等于0" : !HasGuidance ? "失去引导" : "未知原因"; Console.WriteLine($"导弹 {Id} 自毁。原因: {reason}"); Deactivate(); } } /// /// 获取导弹状态 /// public override string GetStatus() { MissileRunningState missileRunningState = GetRunningState(); return $"导弹 {missileRunningState.Id}:\n" + $" 位置: {missileRunningState.Position}\n" + $" 速度: {missileRunningState.Speed:F2} m/s\n" + $" 速度分量: {missileRunningState.Velocity}\n" + $" 朝向: {missileRunningState.Orientation}\n" + $" 飞行时间: {missileRunningState.FlightTime:F2}/{MissileProperties.MaxFlightTime:F2}\n" + $" 飞行距离: {missileRunningState.FlightDistance:F2}/{MissileProperties.MaxFlightDistance:F2}\n" + $" 发动机工作时间: {missileRunningState.EngineBurnTime:F2}/{MissileProperties.MaxEngineBurnTime:F2}\n" + $" 有引导: {(missileRunningState.HasGuidance ? "是" : "否")}\n" + $" 失去引导时间: {missileRunningState.LostGuidanceTime:F2}\n"; } /// /// 更新导弹的制导状态 /// protected virtual void UpdateGuidanceStatus() { // 基类中的默认实现 } public MissileRunningState GetRunningState() { return new MissileRunningState { Id = Id, Type = MissileProperties.Type, Position = Position, Velocity = Velocity, Orientation = Orientation, Speed = Speed, FlightTime = FlightTime, FlightDistance = FlightDistance, HasGuidance = HasGuidance, LostGuidanceTime = LostGuidanceTime, EngineBurnTime = EngineBurnTime, IsActive = IsActive }; } } /// /// 表示导弹的运行状态信息 /// public struct MissileRunningState { /// /// 导弹ID /// public string Id { get; set; } /// /// 导弹类型 /// public MissileType Type { get; set; } /// /// 当前位置 /// public Vector3D Position { get; set; } /// /// 当前速度向量 /// public Vector3D Velocity { get; set; } /// /// 当前朝向 /// public Orientation Orientation { get; set; } /// /// 当前速度(米/秒) /// public double Speed { get; set; } /// /// 当前飞行时间(秒) /// public double FlightTime { get; set; } /// /// 当前飞行距离(米) /// public double FlightDistance { get; set; } /// /// 是否有制导 /// public bool HasGuidance { get; set; } /// /// 失去制导时间(秒) /// public double LostGuidanceTime { get; set; } /// /// 当前发动机燃烧时间(秒) /// public double EngineBurnTime { get; set; } /// /// 是否处于活动状态 /// public bool IsActive { get; set; } } }