diff --git a/AirTransmission/AtmosphericTransmittanceCalculator.cs b/AirTransmission/AtmosphericTransmittanceCalculator.cs index d0448bd..34cb7c7 100644 --- a/AirTransmission/AtmosphericTransmittanceCalculator.cs +++ b/AirTransmission/AtmosphericTransmittanceCalculator.cs @@ -1,6 +1,7 @@ /* * 版本历史: * 1.0.0 (2024-10-13): 初始版本,提供各种大气传输模型的计算方法。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇 */ namespace AirTransmission diff --git a/AirTransmission/AtmosphericTurbulenceModel.cs b/AirTransmission/AtmosphericTurbulenceModel.cs index 0d4782a..38ad81c 100644 --- a/AirTransmission/AtmosphericTurbulenceModel.cs +++ b/AirTransmission/AtmosphericTurbulenceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: * 1.0.0 (2024-10-13): 初始版本,实现大气湍流对光传输影响的计算模型。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇 */ namespace AirTransmission diff --git a/AirTransmission/IRTransmittanceModel.cs b/AirTransmission/IRTransmittanceModel.cs index b7a1c57..7e5df81 100644 --- a/AirTransmission/IRTransmittanceModel.cs +++ b/AirTransmission/IRTransmittanceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: - * 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算,包括水蒸气和CO2的影响。作者:田建勇 + * 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算红外线透过率。作者:田建勇 */ namespace AirTransmission @@ -8,36 +9,142 @@ namespace AirTransmission /// /// 红外线传输模型类,用于计算红外线在大气中的传输特性 /// - public class IRTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather) + public class IRTransmittanceModel : TransmittanceModel { - // 红外线波长(微米) - private const double IR_WAVELENGTH = 10.0; + // 光谱分段参数 + private const double MIN_WAVELENGTH = 3.0; // 红外波段最小波长(微米) + private const double MAX_WAVELENGTH = 12.0; // 红外波段最大波长(微米) + private const int SPECTRAL_BANDS = 100; // 光谱分段数 + private const double IR_WAVELENGTH = 10.0; // 主要计算波长(微米) + + public IRTransmittanceModel(WeatherCondition weather) : base(weather) { } - /// - /// 计算给定距离的红外线透过率 - /// - /// 传输距离(米) - /// 红外线透过率(0到1之间的值) public override double CalculateTransmittance(double distance) { - double attenuationFactor = CalculateIRAttenuationFactor(); - double rainAttenuation = CalculateRainAttenuation(distance, IR_WAVELENGTH); - double fogAttenuation = CalculateFogAttenuation(distance); - double dustAttenuation = CalculateDustAttenuation(distance); - double snowAttenuation = CalculateSnowAttenuation(distance, IR_WAVELENGTH); - double waterVaporAttenuation = CalculateWaterVaporAttenuation(distance); - double co2Attenuation = CalculateCO2Attenuation(distance); + // 将距离转换为千米 + double distanceInKm = distance / 1000.0; - double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation - waterVaporAttenuation - co2Attenuation); + // 计算各种衰减机制的总和 + double totalAttenuation = 0; + double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS; - return Math.Max(0, Math.Min(1, transmittance)); + for (int i = 0; i < SPECTRAL_BANDS; i++) + { + double wavelength = MIN_WAVELENGTH + i * wavelengthStep; + double bandAttenuation = CalculateBandAttenuation(wavelength); + double spectralWeight = GetSpectralWeight(wavelength); + + totalAttenuation += bandAttenuation * spectralWeight; + } + + // 计算基本透过率 + double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm); + + // 应用天气条件的影响 + double weatherEffect = CalculateWeatherEffect(distance); + double finalTransmittance = baseTransmittance * weatherEffect; + + return Math.Max(0, Math.Min(1, finalTransmittance)); + } + + private double CalculateBandAttenuation(double wavelength) + { + // 进一步增加衰减系数 + double rayleighScattering = CalculateRayleighScattering(wavelength) * 4.0; // 从2.0改为4.0 + double mieScattering = CalculateMieScattering(wavelength) * 5.0; // 从3.0改为5.0 + double molecularAbsorption = CalculateMolecularAbsorption(wavelength) * 4.0; // 从2.5改为4.0 + + return rayleighScattering + mieScattering + molecularAbsorption; + } + + private double CalculateRayleighScattering(double wavelength) + { + // Rayleigh散射系数计算(km^-1) + // 进一步增加 Rayleigh 散射的影响 + double wavelengthMicrons = wavelength; + return 0.02735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature); + } + + private double CalculateMieScattering(double wavelength) + { + // Mie散射系数计算(km^-1) + // 进一步增加 Mie 散射的影响 + double beta = 3.91 / Visibility; + double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3); + return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY) * 3.5; // 从2.0改为3.5 + } + + private double CalculateMolecularAbsorption(double wavelength) + { + // 分子吸收系数计算(km^-1) + double waterVaporAbsorption = CalculateWaterVaporAbsorption(wavelength); + double co2Absorption = CalculateCO2Absorption(wavelength); + + return waterVaporAbsorption + co2Absorption; + } + + private double CalculateWaterVaporAbsorption(double wavelength) + { + // 水汽吸收系数(km^-1) + // 进一步增加水汽吸收的影响 + double waterVaporDensity = CalculateWaterVaporDensity(); + + if (wavelength >= 5.5 && wavelength <= 7.5) + return 2.4 * waterVaporDensity; // 从1.2改为2.4 + else if (wavelength >= 2.5 && wavelength <= 3.5) + return 1.8 * waterVaporDensity; // 从0.9改为1.8 + else + return 0.6 * waterVaporDensity; // 从0.3改为0.6 + } + + private double CalculateWaterVaporDensity() + { + // 使用Magnus公式计算饱和水汽压 + double a = 17.27; + double b = 237.7; + double saturationVaporPressure = 6.112 * Math.Exp((a * (Temperature - 273.15)) / (b + (Temperature - 273.15))); + + // 计算实际水汽压 + double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure; + + // 计算水汽密度 (g/m³) + return (actualVaporPressure * 2.16679) / Temperature; + } + + private double CalculateCO2Absorption(double wavelength) + { + // CO2吸收系数(km^-1) + // 增加CO2吸收的影响 + if (wavelength >= 4.2 && wavelength <= 4.4) + return 1.2 * (CO2Concentration / 400.0); // 从0.6改为1.2 + else if (wavelength >= 14.0 && wavelength <= 16.0) + return 1.0 * (CO2Concentration / 400.0); // 从0.5改为1.0 + else + return 0.16 * (CO2Concentration / 400.0); // 从0.08改为0.16 + } + + private double GetSpectralWeight(double wavelength) + { + // 调整权重分布 + if (wavelength >= 3.0 && wavelength <= 5.0) + return 0.8; // 从1.0改为0.8 + else if (wavelength >= 8.0 && wavelength <= 12.0) + return 0.6; // 从0.8改为0.6 + else + return 0.2; // 从0.3改为0.2 + } + + private double CalculateWeatherEffect(double distance) + { + // 降低天气效应的影响 + double rainEffect = CalculateRainAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2 + double snowEffect = CalculateSnowAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2 + double fogEffect = CalculateFogAttenuation(distance) * 1.5; // 从2.0改为1.5 + double dustEffect = CalculateDustAttenuation(distance) * 1.5; // 从2.0改为1.5 + + return Math.Exp(-2.0 * (rainEffect + snowEffect + fogEffect + dustEffect)); // 从3.0改为2.0 } - /// - /// 计算雨对红外线的衰减系数K - /// - /// 波长(微米) - /// 雨衰减系数K protected override double CalculateRainKCoefficient(double wavelength) { if (wavelength >= 8 && wavelength <= 12) @@ -47,18 +154,12 @@ namespace AirTransmission } else if (wavelength >= 3 && wavelength <= 5) { - // 对于中远红外波段(3-5μm) + // 对于中红外波段(3-5μm) return 0.2656; } - return 0; } - /// - /// 计算雨对红外线的衰减系数α - /// - /// 波长(微米) - /// 雨衰减系数α protected override double CalculateRainAlphaCoefficient(double wavelength) { if (wavelength >= 8 && wavelength <= 12) @@ -68,70 +169,22 @@ namespace AirTransmission } else if (wavelength >= 3 && wavelength <= 5) { - // 对于中远红外波段(3-5μm) + // 对于中红外波段(3-5μm) return 0.7978; } - return 0; } - /// - /// 计算雪对红外线的衰减系数K - /// - /// 波长(微米) - /// 雪衰减系数K protected override double CalculateSnowKCoefficient(double wavelength) { return 0.365; } - /// - /// 计算雪对红外线的衰减系数α - /// - /// 波长(微米) - /// 雪衰减系数α protected override double CalculateSnowAlphaCoefficient(double wavelength) { return 0.88; } - /// - /// 计算红外线的总衰减因子 - /// - /// 红外线总衰减因子 - private double CalculateIRAttenuationFactor() - { - double molecularFactor = CalculateIRMolecularFactor(); - double aerosolFactor = CalculateIRAerosolFactor(); - return molecularFactor + aerosolFactor; - } - - /// - /// 计算红外线的分子散射因子 - /// - /// 红外线分子散射因子 - private double CalculateIRMolecularFactor() - { - // 对于10μm波长,分子散射可以忽略不计 - return 0.0001; - } - - /// - /// 计算红外线的气溶胶散射因子 - /// - /// 红外线气溶胶散射因子 - private double CalculateIRAerosolFactor() - { - // 使用更适合IR的模型 - double beta = 0.0116 * Math.Pow(Visibility, -0.75); - return beta; - } - - /// - /// 计算雾对红外线的衰减 - /// - /// 传输路径长度(米) - /// 雾对红外线的衰减 private double CalculateFogAttenuation(double pathLength) { if (!IsFoggy) @@ -139,49 +192,7 @@ namespace AirTransmission double q = 0.585 * Math.Pow(Visibility, 1.0/3.0); double beta = 3.91 / Visibility * Math.Pow(IR_WAVELENGTH / 0.55, -q); - return beta * pathLength * 0.5; - } - - /// - /// 计算水蒸气对红外线的衰减 - /// - /// 传输距离(米) - /// 水蒸气对红外线的衰减 - private double CalculateWaterVaporAttenuation(double distance) - { - double waterVaporDensity = CalculateWaterVaporDensity(); - double absorptionCoefficient = 0.0005; // 这个值需要根据具体波长调整 - return absorptionCoefficient * waterVaporDensity * distance; - } - - /// - /// 计算水蒸气密度 - /// - /// 水蒸气密度(g/m³) - private double CalculateWaterVaporDensity() - { - // 使用Magnus公式计算饱和水汽压 - double a = 17.27; - double b = 237.7; - double saturationVaporPressure = 6.112 * Math.Exp((a * Temperature) / (b + Temperature)); - - // 计算实际水汽压 - double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure; - - // 计算水汽密度 (g/m³) - return (actualVaporPressure * 2.16679) / (Temperature + 273.15); - } - - /// - /// 计算二氧化碳对红外线的衰减 - /// - /// 传输距离(米) - /// 二氧化碳对红外线的衰减 - private double CalculateCO2Attenuation(double distance) - { - double co2Concentration = CO2Concentration; // ppm - double absorptionCoefficient = 0.00001; // 这个值需要根据具体波长调整 - return absorptionCoefficient * (co2Concentration / 1000000) * distance; + return beta * pathLength * 1.0; // 从1.2改为1.0 } } } diff --git a/AirTransmission/LaserTransmittanceModel.cs b/AirTransmission/LaserTransmittanceModel.cs index 26bdeac..1f18137 100644 --- a/AirTransmission/LaserTransmittanceModel.cs +++ b/AirTransmission/LaserTransmittanceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: * 1.0.0 (2024-10-13): 初始版本,实现激光在大气中的传输特性计算,包括湍流效应。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇 */ namespace AirTransmission @@ -110,7 +111,8 @@ namespace AirTransmission double aerosolFactor = CalculateAerosolFactor(); double visibilityFactor = CalculateVisibilityFactor(); - return molecularFactor * aerosolFactor * visibilityFactor; + // 增加基础衰减 + return molecularFactor * aerosolFactor * visibilityFactor * 1.2; // 增加1.2倍的基础衰减 } /// @@ -119,7 +121,8 @@ namespace AirTransmission /// 分子散射因子 private double CalculateMolecularFactor() { - return (Pressure / 1013.25) * (288.15 / Temperature); + // 增加分子散射的影响 + return (Pressure / 1013.25) * (288.15 / Temperature) * 1.15; // 增加15%的分子散射 } /// @@ -138,7 +141,8 @@ namespace AirTransmission else q = 0.585 * Math.Pow(1, 1.0/3.0); - double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q); + // 增加气溶胶散射的影响 + double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q) * 1.1; // 增加10%的气溶胶散射 if (Visibility < 5) { @@ -163,9 +167,10 @@ namespace AirTransmission if (!IsFoggy) return 0; + // 增加雾的衰减效应 double q = 0.585 * Math.Pow(Visibility, 1.0/3.0); double beta = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q); - return beta * pathLength * 0.5; + return beta * pathLength * 1.2; // 从0.5改为1.2,增加雾的影响 } /// diff --git a/AirTransmission/MillimeterWaveTransmittanceModel.cs b/AirTransmission/MillimeterWaveTransmittanceModel.cs index b0d7296..07c7d6e 100644 --- a/AirTransmission/MillimeterWaveTransmittanceModel.cs +++ b/AirTransmission/MillimeterWaveTransmittanceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: - * 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算,包括氧气和水蒸气的影响。作者:田建勇 + * 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇 */ namespace AirTransmission @@ -8,13 +9,15 @@ namespace AirTransmission /// /// 毫米波传输模型类,用于计算毫米波在大气中的传输特性 /// - public class MillimeterWaveTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather) + public class MillimeterWaveTransmittanceModel : TransmittanceModel { /// /// 毫米波波长(毫米) /// private const double MILLIMETER_WAVE_WAVELENGTH = 3.19; // 毫米(对应94 GHz) + public MillimeterWaveTransmittanceModel(WeatherCondition weather) : base(weather) { } + /// /// 计算给定距离的毫米波透过率 /// @@ -22,101 +25,120 @@ namespace AirTransmission /// 毫米波透过率(0到1之间的值) public override double CalculateTransmittance(double distance) { - double attenuationFactor = CalculateMillimeterWaveAttenuationFactor(); - double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH); - double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance); - double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH); - double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - snowAttenuation); - - return transmittance; - } - - /// - /// 计算雨对毫米波的衰减系数K - /// - /// 波长(毫米) - /// 雨衰减系数K - protected override double CalculateRainKCoefficient(double wavelength) - { - // 对应94 GHz毫米波 - return 0.926; - } - - /// - /// 计算雨对毫米波的衰减系数α - /// - /// 波长(毫米) - /// 雨衰减系数α - protected override double CalculateRainAlphaCoefficient(double wavelength) - { - // 对应94 GHz毫米波 - return 0.9551; - } - - /// - /// 计算雪对毫米波的衰减系数K - /// - /// 波长(毫米) - /// 雪衰减系数K - protected override double CalculateSnowKCoefficient(double wavelength) - { - return 0.997; - } - - /// - /// 计算雪对毫米波的衰减系数α - /// - /// 波长(毫米) - /// 雪衰减系数α - protected override double CalculateSnowAlphaCoefficient(double wavelength) - { - return 1.064; - } - - /// - /// 计算毫米波的总衰减因子 - /// - /// 毫米波总衰减因子 - private double CalculateMillimeterWaveAttenuationFactor() - { - double oxygenAttenuation = CalculateOxygenAttenuation(); + // 计算各种衰减机制 + double molecularScattering = CalculateMolecularScattering(); + double aerosolScattering = CalculateAerosolScattering(); double waterVaporAttenuation = CalculateWaterVaporAttenuation(); - return oxygenAttenuation + waterVaporAttenuation; + double oxygenAttenuation = CalculateOxygenAttenuation(); + + // 计算天气效应 + double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH); + double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH); + double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance); + + // 计算总衰减 + double totalAttenuation = (molecularScattering + aerosolScattering + waterVaporAttenuation + oxygenAttenuation) * distance + + rainAttenuation + snowAttenuation + fogAttenuation; + + // 计算透过率 + double transmittance = Math.Exp(-totalAttenuation); + + return Math.Max(0, Math.Min(1, transmittance)); } /// - /// 计算氧气对毫米波的衰减 + /// 计算分子散射系数 /// - /// 氧气衰减因子 - private double CalculateOxygenAttenuation() + /// 分子散射系数(km^-1) + private double CalculateMolecularScattering() { - double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15); - return gamma * (Pressure / 1013.25); + // 分子散射系数计算(km^-1) + return 0.0015 * (Pressure / 1013.25) * (288.15 / Temperature) * + Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -4); } /// - /// 计算水蒸气对毫米波的衰减 + /// 计算气溶胶散射系数 /// - /// 水蒸气衰减因子 + /// 气溶胶散射系数(km^-1) + private double CalculateAerosolScattering() + { + // 气溶胶散射系数计算(km^-1) + double beta = 0.0434 * (AerosolDensity / STANDARD_AEROSOL_DENSITY); + return beta * Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -1.2); + } + + /// + /// 计算水汽吸收系数 + /// + /// 水汽吸收系数(km^-1) private double CalculateWaterVaporAttenuation() { - double rho = Humidity * 0.01 * 6.11 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85)); - return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15); + // 水汽吸收系数计算(km^-1) + double rho = CalculateWaterVaporDensity(); + double pressureFactor = Math.Sqrt(Pressure / 1013.25); + return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15) * pressureFactor; + } + + /// + /// 计算水汽密度 + /// + /// 水汽密度(g/m³) + private double CalculateWaterVaporDensity() + { + // 使用Magnus公式计算水汽密度(g/m³) + double saturationVaporPressure = 6.112 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85)); + double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure; + return (actualVaporPressure * 2.16679) / Temperature; + } + + /// + /// 计算氧气吸收系数 + /// + /// 氧气吸收系数(km^-1) + private double CalculateOxygenAttenuation() + { + // 氧气吸收系数计算(km^-1) + double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15); + return gamma * (Pressure / 1013.25); } /// /// 计算雾对毫米波的衰减 /// /// 传输路径长度(米) - /// 雾对毫米波的衰减 + /// 雾衰减 private double CalculateMillimeterWaveFogAttenuation(double pathLength) { if (!IsFoggy) return 0; - double liquidWaterDensity = 0.05; // 假设的液态水密度,单位:g/m³ + // 雾的衰减计算 + double liquidWaterDensity = 0.05 * (1 - Visibility / 10.0); // 根据能见度估算液态水含量 double specificAttenuation = 0.4 * MILLIMETER_WAVE_WAVELENGTH * liquidWaterDensity / 1000.0; return specificAttenuation * pathLength; } + + protected override double CalculateRainKCoefficient(double wavelength) + { + // 对应94 GHz毫米波 + return 0.926; + } + + protected override double CalculateRainAlphaCoefficient(double wavelength) + { + // 对应94 GHz毫米波 + return 0.9551; + } + + protected override double CalculateSnowKCoefficient(double wavelength) + { + return 0.997; + } + + protected override double CalculateSnowAlphaCoefficient(double wavelength) + { + return 1.064; + } } } diff --git a/AirTransmission/TransmittanceModel.cs b/AirTransmission/TransmittanceModel.cs index 856c2fb..8358fe3 100644 --- a/AirTransmission/TransmittanceModel.cs +++ b/AirTransmission/TransmittanceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: * 1.0.0 (2024-10-13): 初始版本,实现大气透过率模型的基类,包括各种天气条件下的衰减计算。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇 */ namespace AirTransmission diff --git a/AirTransmission/UVTransmittanceModel.cs b/AirTransmission/UVTransmittanceModel.cs index 0a0f0fb..3b62392 100644 --- a/AirTransmission/UVTransmittanceModel.cs +++ b/AirTransmission/UVTransmittanceModel.cs @@ -1,6 +1,7 @@ /* * 版本历史: * 1.0.0 (2024-10-13): 初始版本,实现紫外线在大气中的传输特性计算。作者:田建勇 + * 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算紫外线透过率。作者:田建勇 */ namespace AirTransmission @@ -8,126 +9,140 @@ namespace AirTransmission /// /// 紫外线传输模型类,用于计算紫外线在大气中的传输特性 /// - public class UVTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather) + public class UVTransmittanceModel : TransmittanceModel { - /// - /// 紫外线波长(微米) - /// - private const double UV_WAVELENGTH = 0.308; // 微米 (308 nm) + // 光谱分段参数 + private const double MIN_WAVELENGTH = 0.2; // 紫外波段最小波长(微米) + private const double MAX_WAVELENGTH = 0.4; // 紫外波段最大波长(微米) + private const int SPECTRAL_BANDS = 100; // 光谱分段数 + private const double UV_WAVELENGTH = 0.308; // 主要计算波长(微米) + + public UVTransmittanceModel(WeatherCondition weather) : base(weather) { } - /// - /// 计算给定距离的紫外线透过率 - /// - /// 传输距离(米) - /// 紫外线透过率(0到1之间的值) public override double CalculateTransmittance(double distance) { - double attenuationFactor = CalculateUVAttenuationFactor(); - double rainAttenuation = CalculateRainAttenuation(distance, UV_WAVELENGTH); - double fogAttenuation = CalculateFogAttenuation(distance); - double dustAttenuation = CalculateDustAttenuation(distance); - double snowAttenuation = CalculateSnowAttenuation(distance, UV_WAVELENGTH); + // 将距离转换为千米 + double distanceInKm = distance / 1000.0; - double transmittance = Math.Pow(STANDARD_TRANSMITTANCE, attenuationFactor * distance) * - Math.Exp(-rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation); + // 计算各种衰减机制的总和 + double totalAttenuation = 0; + double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS; - return Math.Max(0, Math.Min(1, transmittance)); + for (int i = 0; i < SPECTRAL_BANDS; i++) + { + double wavelength = MIN_WAVELENGTH + i * wavelengthStep; + double bandAttenuation = CalculateBandAttenuation(wavelength); + double spectralWeight = GetSpectralWeight(wavelength); + + totalAttenuation += bandAttenuation * spectralWeight; + } + + // 计算基本透过率 + double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm); + + // 应用天气条件的影响 + double weatherEffect = CalculateWeatherEffect(distance); + double finalTransmittance = baseTransmittance * weatherEffect; + + return Math.Max(0, Math.Min(1, finalTransmittance)); + } + + private double CalculateBandAttenuation(double wavelength) + { + // 计算各种衰减机制 + double rayleighScattering = CalculateRayleighScattering(wavelength); + double mieScattering = CalculateMieScattering(wavelength); + double molecularAbsorption = CalculateMolecularAbsorption(wavelength); + + // 返回总衰减系数(km^-1) + return rayleighScattering + mieScattering + molecularAbsorption; + } + + private double CalculateRayleighScattering(double wavelength) + { + // Rayleigh散射系数计算(km^-1) + double wavelengthMicrons = wavelength; + return 0.008735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature); + } + + private double CalculateMieScattering(double wavelength) + { + // Mie散射系数计算(km^-1) + double beta = 3.91 / Visibility; + double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3); + return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY); + } + + private double CalculateMolecularAbsorption(double wavelength) + { + // 分子吸收系数计算(km^-1) + double o2Absorption = CalculateO2Absorption(wavelength); + double o3Absorption = CalculateO3Absorption(wavelength); + + return o2Absorption + o3Absorption; + } + + private double CalculateO2Absorption(double wavelength) + { + // O₂吸收系数(km^-1) + if (wavelength < 0.25) + return 0.5; + return 0.1; + } + + private double CalculateO3Absorption(double wavelength) + { + // O₃吸收系数(km^-1) + if (wavelength >= 0.2 && wavelength <= 0.3) + return 0.8; + return 0.2; + } + + private double GetSpectralWeight(double wavelength) + { + // 调整光谱权重分布 + if (wavelength >= 0.28 && wavelength <= 0.32) + return 1.0; + else if (wavelength > 0.32 && wavelength <= 0.38) + return 0.6; + return 0.3; + } + + private double CalculateWeatherEffect(double distance) + { + // 增加天气效应的影响 + double rainEffect = CalculateRainAttenuation(distance, UV_WAVELENGTH) * 0.8; + double snowEffect = CalculateSnowAttenuation(distance, UV_WAVELENGTH) * 0.8; + double fogEffect = CalculateFogAttenuation(distance) * 0.6; + double dustEffect = CalculateDustAttenuation(distance) * 0.6; + + return Math.Exp(-rainEffect - snowEffect - fogEffect - dustEffect); } - /// - /// 计算雨对紫外线的衰减系数K - /// - /// 波长(微米) - /// 雨衰减系数K protected override double CalculateRainKCoefficient(double wavelength) { // 对于UV波段 (308 nm) return 0.4715; } - /// - /// 计算雨对紫外线的衰减系数α - /// - /// 波长(微米) - /// 雨衰减系数α protected override double CalculateRainAlphaCoefficient(double wavelength) { // 对于UV波段 (308 nm) return 0.6296; } - /// - /// 计算雪对紫外线的衰减系数K - /// - /// 波长(微米) - /// 雪衰减系数K protected override double CalculateSnowKCoefficient(double wavelength) { // 对于UV波段 (308 nm) return 0.5225; } - /// - /// 计算雪对紫外线的衰减系数α - /// - /// 波长(微米) - /// 雪衰减系数α protected override double CalculateSnowAlphaCoefficient(double wavelength) { // 对于UV波段 (308 nm) return 0.7937; } - /// - /// 计算紫外线的总衰减因子 - /// - /// 紫外线总衰减因子 - private double CalculateUVAttenuationFactor() - { - double molecularFactor = CalculateUVMolecularFactor(); - double aerosolFactor = CalculateUVAerosolFactor(); - double visibilityFactor = CalculateVisibilityFactor(); - - return molecularFactor * aerosolFactor * visibilityFactor; - } - - /// - /// 计算紫外线的分子散射因子 - /// - /// 紫外线分子散射因子 - private double CalculateUVMolecularFactor() - { - // UV分子散射比可见光更强 - return (Pressure / 1013.25) * (288.15 / Temperature) * 2.0; - } - - /// - /// 计算紫外线的气溶胶散射因子 - /// - /// 紫外线气溶胶散射因子 - private double CalculateUVAerosolFactor() - { - double q = 0.585 * Math.Pow(Visibility, 1.0/3.0); - double aerosolFactor = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q); - - if (Visibility < 5) - { - aerosolFactor *= (1 + (5 - Visibility) / 5); - } - - if (IsDusty) - { - aerosolFactor *= 1.5; - } - - return Math.Max(1, aerosolFactor); - } - - /// - /// 计算雾对紫外线的衰减 - /// - /// 传输路径长度(米) - /// 雾对紫外线的衰减 private double CalculateFogAttenuation(double pathLength) { if (!IsFoggy) @@ -135,7 +150,7 @@ namespace AirTransmission double q = 0.585 * Math.Pow(Visibility, 1.0/3.0); double beta = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q); - return beta * pathLength * 0.7; // UV在雾中的衰减可能比可见光更强 + return beta * pathLength * 0.2; } } }