ActiveProtect/Models/TerminalSensitiveMissile.cs

107 lines
4.2 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
{
// 分离高度 1000米默认 1000 米
private const double SeparationHeight = 1000;
// 分离点距离目标水平距离,默认 1000 米
private const double SeparationDistance = 1000;
// 分离时距离分离点的距离阈值,默认 50米
private const double SeparationRange = 50;
// 分离时距目标距离阈值,默认 1400 米
private const double SeparationTargetDistance = 1400;
// 子弹数量, 155 口径母弹,默认 2 个
private const int SubmunitionCount = 1;
// 子弹数组
private TerminalSensitiveSubmunition[] submunitions;
// 分离点位置
private readonly Vector3D separationPoint;
public TerminalSensitiveMissile(MissileConfig config, ISimulationManager manager)
: base(config, manager)
{
submunitions = new TerminalSensitiveSubmunition[SubmunitionCount];
//计算分离点坐标高度为SeparationHeight距离目标的距离为SeparationDistance
separationPoint = Vector3D.PointOnLine(base.SimulationManager.GetEntityById(TargetId).Position, base.Position, SeparationDistance) + new Vector3D(0, SeparationHeight, 0);
}
/// <summary>
/// 更新导弹
/// </summary>
/// <param name="deltaTime">时间步长</param>
public override void Update(double deltaTime)
{
base.Update(deltaTime);
GuidanceAcceleration = new Vector3D(0, -9.8, 0);
Console.WriteLine($"分离点距离: {(separationPoint - Position).Magnitude()}");
//计算到目标的距离
double distanceToTarget = (SimulationManager.GetEntityById(TargetId).Position - Position).Magnitude();
//距离分离点距离小于50米或者距离目标小于1400米则分离
if ((separationPoint - Position).Magnitude() <= SeparationRange || distanceToTarget <= SeparationTargetDistance)
{
Console.WriteLine("分离");
PerformSeparation();
}
}
// 分离动作,母弹抛出 2 个子弹,子弹朝向目标方向
// 初始化子弹,设置子弹参数
// 母弹完成任务,可以被移除
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(
new MissileConfig
{
Id = $"{Id}_Sub_{i}",
InitialPosition = this.Position,
InitialOrientation = orientationToTarget, // 设置为朝向目标的方向
InitialSpeed = 200, // 子弹初始速度
MaxSpeed = 2000,
TargetIndex = 0,
MaxFlightTime = 50,
MaxFlightDistance = 1000,
MaxAcceleration = 50,
ProportionalNavigationCoefficient = 3,
Mass = 10,
ExplosionRadius = 10
},
SimulationManager);
SimulationManager.AddElement(submunitions[i]);
submunitions[i].Activate();
}
// 母弹完成任务,可以被移除
IsActive = false;
}
/// <summary>
/// 获取导弹状态
/// </summary>
/// <returns>导弹状态</returns>
public override string GetStatus()
{
return $"{base.GetStatus()}\n母弹, 分离点: {separationPoint}";
}
}
}