using System;
using ActiveProtect.SimulationEnvironment;
namespace ActiveProtect.Models
{
///
/// 毫米波导引头系统
///
public class MillimeterWaveGuidanceSystem : BasicGuidanceSystem
{
private const double MAX_DETECTION_RANGE = 5000; // 最大探测范围(米)
private const double FIELD_OF_VIEW = Math.PI / 4; // 视场角(弧度), 45度
private const double TARGET_RECOGNITION_PROBABILITY = 0.95; // 目标识别概率
private const double WAVE_FREQUENCY = 94e9; // 毫米波频率(Hz), 94GHz
private const double PULSE_DURATION = 1e-6; // 脉冲持续时间(秒)
private const double RECOGNITION_SNR_THRESHOLD = 6; // 识别目标信噪比阈值, 单位dB
private readonly Random random = new();
private Vector3D lastTargetPosition;
public ISimulationManager SimulationManager { get; set; }
///
/// 毫米波导引头系统构造函数
///
public MillimeterWaveGuidanceSystem(double maxAcceleration, double guidanceCoefficient, ISimulationManager simulationManager) : base(maxAcceleration, guidanceCoefficient)
{
SimulationManager = simulationManager;
lastTargetPosition = Vector3D.Zero;
}
///
/// 更新引导系统
///
public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity)
{
base.Update(deltaTime, missilePosition, missileVelocity);
if (TryDetectTank(missilePosition, missileVelocity, out Vector3D tankPosition))
{
//根据目标当前位置和上一次位置计算目标速度
Vector3D targetVelocity = (tankPosition - lastTargetPosition) / deltaTime;
lastTargetPosition = tankPosition;
// 使用基类的比例控制算法
GuidanceAcceleration = CalculateProportionalNavigation(ProportionalNavigationCoefficient, missilePosition, missileVelocity, tankPosition, targetVelocity);
if (GuidanceAcceleration.Magnitude() > MaxAcceleration)
{
GuidanceAcceleration = GuidanceAcceleration.Normalize() * MaxAcceleration;
}
HasGuidance = true;
}
else
{
HasGuidance = false;
}
}
///
/// 尝试探测目标
///
private bool TryDetectTank(Vector3D missilePosition, Vector3D missileVelocity, out Vector3D targetPosition)
{
targetPosition = Vector3D.Zero;
foreach (var element in SimulationManager.GetElements())
{
if (element is Tank tank)
{
Vector3D toTarget = tank.Position - missilePosition;
double distance = toTarget.Magnitude();
if (distance <= MAX_DETECTION_RANGE)
{
double angle = Math.Acos(Vector3D.DotProduct(toTarget.Normalize(), missileVelocity.Normalize()));
if (angle <= FIELD_OF_VIEW / 2)
{
// 模拟毫米波探测
double snr = CalculateSNR(distance, tank.RadarCrossSection);
Console.WriteLine($" 80信噪比 {snr}");
if(snr > RECOGNITION_SNR_THRESHOLD && random.NextDouble() < TARGET_RECOGNITION_PROBABILITY)
{
targetPosition = tank.Position;
return true;
}
}
}
}
}
return false;
}
///
/// 获取导弹状态
///
public override string GetStatus()
{
return base.GetStatus() + $", Target Position: {lastTargetPosition}";
}
///
/// 计算信噪比
///
private static double CalculateSNR(double distance, double radarCrossSection)
{
// 雷达参数
double transmitPower = 100; // 发射功率(W)
double antennaGain = Math.Pow(10, 30/10); // 天线增益(线性值,从dB转换)
double wavelength = 3e8 / WAVE_FREQUENCY; // 波长(m)
double bandwidth = 1e6; // 接收机带宽(Hz),假设为1MHz
double noiseFigure = Math.Pow(10, 3/10); // 噪声系数(线性值,假设为3dB)
// 常量
double k = 1.38e-23; // 玻尔兹曼常数
double T0 = 290; // 标准噪声温度(K)
// 计算接收信号功率
double signalPower = (transmitPower * Math.Pow(antennaGain, 2) * Math.Pow(wavelength, 2) * radarCrossSection)
/ (Math.Pow(4 * Math.PI, 3) * Math.Pow(distance, 4));
// 计算噪声功率
double noisePower = k * T0 * bandwidth * noiseFigure;
// 计算信噪比
double snr = signalPower / noisePower;
// 转换为dB
return 10 * Math.Log10(snr);
}
}
}