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; }
}
}