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