ActiveProtect/Models/TerminalSensitiveMissile.cs

104 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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