using System; using System.Collections.Generic; using ActiveProtect.SimulationEnvironment; namespace ActiveProtect.Models { public class TerminalSensitiveMissile : MissileBase { private TerminalSensitiveSubmunition[] submunitions; private Vector3D guidanceCommand; // 分离高度 1000米 private const double SeparationHeight = 1000; // 分离点距离目标水平距离 private const double SeparationDistance = 1000; private Vector3D separationPoint; // 子弹数量 private const int SubmunitionCount = 2; public TerminalSensitiveMissile(string id, MissileConfig missileConfig, ISimulationManager simulationManager) : base(id, missileConfig, simulationManager) { submunitions = new TerminalSensitiveSubmunition[SubmunitionCount]; guidanceCommand = Vector3D.Zero; //计算分离点坐标,高度为SeparationHeight,距离目标的距离为SeparationDistance separationPoint = Vector3D.PointOnLine(SimulationManager.GetEntityById(TargetId).Position, Position, SeparationDistance) + new Vector3D(0, SeparationHeight, 0); } public override void Update(double deltaTime) { base.Update(deltaTime); // 无动力抛物线飞行 ApplyGravity(deltaTime); Console.WriteLine($"分离点距离: {(separationPoint - Position).Magnitude()}"); //计算到目标的距离 double distanceToTarget = (SimulationManager.GetEntityById(TargetId).Position - Position).Magnitude(); //距离分离点距离小于50米,或者距离目标小于1400米,则分离 if ((separationPoint - Position).Magnitude() <= 50 || distanceToTarget <= 1400) { Console.WriteLine("分离"); PerformSeparation(); } } private void PerformSeparation() { // 获取目标位置 Vector3D targetPosition = SimulationManager.GetEntityById(TargetId).Position; // 创建并释放子弹 for (int i = 0; i < SubmunitionCount; i++) { // 计算子弹朝向目标的方向 Vector3D directionToTarget = (targetPosition - this.Position).Normalize(); Orientation orientationToTarget = Orientation.FromVector(directionToTarget); submunitions[i] = new TerminalSensitiveSubmunition($"{Id}_Sub_{i}", new MissileConfig { InitialPosition = this.Position, InitialOrientation = orientationToTarget, // 设置为朝向目标的方向 InitialSpeed = 200, // 子弹初始速度 MaxSpeed = 300, TargetIndex = 0, MaxFlightTime = 10, MaxFlightDistance = 1000, MaxAcceleration = 50, ProportionalNavigationCoefficient = 0.1, Mass = 10 }, SimulationManager); SimulationManager.AddElement(submunitions[i]); } // 母弹完成任务,可以被移除 IsActive = false; } private void ApplyGravity(double deltaTime) { Velocity += new Vector3D(0, -9.8, 0) * deltaTime; } public override string GetStatus() { return $"{base.GetStatus()}\nMother Missile Stage: {currentStage}, Separation Point: {separationPoint}"; } protected override Vector3D GetGuidanceCommand() { return guidanceCommand; } } }