调整了紫外线、红外线、毫米波、激光等传输模型,增加了目标位置关系和大气参数分布的考虑。

This commit is contained in:
Tian jianyong 2024-10-28 09:16:58 +08:00
parent 268e241803
commit ff7bc13a1a
7 changed files with 343 additions and 287 deletions

View File

@ -1,6 +1,7 @@
/*
*
* 1.0.0 (2024-10-13):
* 1.1.0 (2024-10-18):
*/
namespace AirTransmission

View File

@ -1,6 +1,7 @@
/*
*
* 1.0.0 (2024-10-13):
* 1.1.0 (2024-10-18):
*/
namespace AirTransmission

View File

@ -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
/// <summary>
/// 红外线传输模型类,用于计算红外线在大气中的传输特性
/// </summary>
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) { }
/// <summary>
/// 计算给定距离的红外线透过率
/// </summary>
/// <param name="distance">传输距离(米)</param>
/// <returns>红外线透过率0到1之间的值</returns>
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
}
/// <summary>
/// 计算雨对红外线的衰减系数K
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雨衰减系数K</returns>
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;
}
/// <summary>
/// 计算雨对红外线的衰减系数α
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雨衰减系数α</returns>
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;
}
/// <summary>
/// 计算雪对红外线的衰减系数K
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雪衰减系数K</returns>
protected override double CalculateSnowKCoefficient(double wavelength)
{
return 0.365;
}
/// <summary>
/// 计算雪对红外线的衰减系数α
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雪衰减系数α</returns>
protected override double CalculateSnowAlphaCoefficient(double wavelength)
{
return 0.88;
}
/// <summary>
/// 计算红外线的总衰减因子
/// </summary>
/// <returns>红外线总衰减因子</returns>
private double CalculateIRAttenuationFactor()
{
double molecularFactor = CalculateIRMolecularFactor();
double aerosolFactor = CalculateIRAerosolFactor();
return molecularFactor + aerosolFactor;
}
/// <summary>
/// 计算红外线的分子散射因子
/// </summary>
/// <returns>红外线分子散射因子</returns>
private double CalculateIRMolecularFactor()
{
// 对于10μm波长分子散射可以忽略不计
return 0.0001;
}
/// <summary>
/// 计算红外线的气溶胶散射因子
/// </summary>
/// <returns>红外线气溶胶散射因子</returns>
private double CalculateIRAerosolFactor()
{
// 使用更适合IR的模型
double beta = 0.0116 * Math.Pow(Visibility, -0.75);
return beta;
}
/// <summary>
/// 计算雾对红外线的衰减
/// </summary>
/// <param name="pathLength">传输路径长度(米)</param>
/// <returns>雾对红外线的衰减</returns>
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;
}
/// <summary>
/// 计算水蒸气对红外线的衰减
/// </summary>
/// <param name="distance">传输距离(米)</param>
/// <returns>水蒸气对红外线的衰减</returns>
private double CalculateWaterVaporAttenuation(double distance)
{
double waterVaporDensity = CalculateWaterVaporDensity();
double absorptionCoefficient = 0.0005; // 这个值需要根据具体波长调整
return absorptionCoefficient * waterVaporDensity * distance;
}
/// <summary>
/// 计算水蒸气密度
/// </summary>
/// <returns>水蒸气密度g/m³</returns>
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);
}
/// <summary>
/// 计算二氧化碳对红外线的衰减
/// </summary>
/// <param name="distance">传输距离(米)</param>
/// <returns>二氧化碳对红外线的衰减</returns>
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
}
}
}

View File

@ -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倍的基础衰减
}
/// <summary>
@ -119,7 +121,8 @@ namespace AirTransmission
/// <returns>分子散射因子</returns>
private double CalculateMolecularFactor()
{
return (Pressure / 1013.25) * (288.15 / Temperature);
// 增加分子散射的影响
return (Pressure / 1013.25) * (288.15 / Temperature) * 1.15; // 增加15%的分子散射
}
/// <summary>
@ -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,增加雾的影响
}
/// <summary>

View File

@ -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
/// <summary>
/// 毫米波传输模型类,用于计算毫米波在大气中的传输特性
/// </summary>
public class MillimeterWaveTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
public class MillimeterWaveTransmittanceModel : TransmittanceModel
{
/// <summary>
/// 毫米波波长(毫米)
/// </summary>
private const double MILLIMETER_WAVE_WAVELENGTH = 3.19; // 毫米对应94 GHz
public MillimeterWaveTransmittanceModel(WeatherCondition weather) : base(weather) { }
/// <summary>
/// 计算给定距离的毫米波透过率
/// </summary>
@ -22,101 +25,120 @@ namespace AirTransmission
/// <returns>毫米波透过率0到1之间的值</returns>
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;
}
/// <summary>
/// 计算雨对毫米波的衰减系数K
/// </summary>
/// <param name="wavelength">波长(毫米)</param>
/// <returns>雨衰减系数K</returns>
protected override double CalculateRainKCoefficient(double wavelength)
{
// 对应94 GHz毫米波
return 0.926;
}
/// <summary>
/// 计算雨对毫米波的衰减系数α
/// </summary>
/// <param name="wavelength">波长(毫米)</param>
/// <returns>雨衰减系数α</returns>
protected override double CalculateRainAlphaCoefficient(double wavelength)
{
// 对应94 GHz毫米波
return 0.9551;
}
/// <summary>
/// 计算雪对毫米波的衰减系数K
/// </summary>
/// <param name="wavelength">波长(毫米)</param>
/// <returns>雪衰减系数K</returns>
protected override double CalculateSnowKCoefficient(double wavelength)
{
return 0.997;
}
/// <summary>
/// 计算雪对毫米波的衰减系数α
/// </summary>
/// <param name="wavelength">波长(毫米)</param>
/// <returns>雪衰减系数α</returns>
protected override double CalculateSnowAlphaCoefficient(double wavelength)
{
return 1.064;
}
/// <summary>
/// 计算毫米波的总衰减因子
/// </summary>
/// <returns>毫米波总衰减因子</returns>
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));
}
/// <summary>
/// 计算氧气对毫米波的衰减
/// 计算分子散射系数
/// </summary>
/// <returns>氧气衰减因子</returns>
private double CalculateOxygenAttenuation()
/// <returns>分子散射系数km^-1</returns>
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);
}
/// <summary>
/// 计算水蒸气对毫米波的衰减
/// 计算气溶胶散射系数
/// </summary>
/// <returns>水蒸气衰减因子</returns>
/// <returns>气溶胶散射系数km^-1</returns>
private double CalculateAerosolScattering()
{
// 气溶胶散射系数计算km^-1
double beta = 0.0434 * (AerosolDensity / STANDARD_AEROSOL_DENSITY);
return beta * Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -1.2);
}
/// <summary>
/// 计算水汽吸收系数
/// </summary>
/// <returns>水汽吸收系数km^-1</returns>
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;
}
/// <summary>
/// 计算水汽密度
/// </summary>
/// <returns>水汽密度g/m³</returns>
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;
}
/// <summary>
/// 计算氧气吸收系数
/// </summary>
/// <returns>氧气吸收系数km^-1</returns>
private double CalculateOxygenAttenuation()
{
// 氧气吸收系数计算km^-1
double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15);
return gamma * (Pressure / 1013.25);
}
/// <summary>
/// 计算雾对毫米波的衰减
/// </summary>
/// <param name="pathLength">传输路径长度(米)</param>
/// <returns>雾对毫米波的衰减</returns>
/// <returns>雾衰减</returns>
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;
}
}
}

View File

@ -1,6 +1,7 @@
/*
*
* 1.0.0 (2024-10-13):
* 1.1.0 (2024-10-18):
*/
namespace AirTransmission

View File

@ -1,6 +1,7 @@
/*
*
* 1.0.0 (2024-10-13): 线
* 1.1.0 (2024-10-18): 线
*/
namespace AirTransmission
@ -8,126 +9,140 @@ namespace AirTransmission
/// <summary>
/// 紫外线传输模型类,用于计算紫外线在大气中的传输特性
/// </summary>
public class UVTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
public class UVTransmittanceModel : TransmittanceModel
{
/// <summary>
/// 紫外线波长(微米)
/// </summary>
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) { }
/// <summary>
/// 计算给定距离的紫外线透过率
/// </summary>
/// <param name="distance">传输距离(米)</param>
/// <returns>紫外线透过率0到1之间的值</returns>
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);
}
/// <summary>
/// 计算雨对紫外线的衰减系数K
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雨衰减系数K</returns>
protected override double CalculateRainKCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.4715;
}
/// <summary>
/// 计算雨对紫外线的衰减系数α
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雨衰减系数α</returns>
protected override double CalculateRainAlphaCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.6296;
}
/// <summary>
/// 计算雪对紫外线的衰减系数K
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雪衰减系数K</returns>
protected override double CalculateSnowKCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.5225;
}
/// <summary>
/// 计算雪对紫外线的衰减系数α
/// </summary>
/// <param name="wavelength">波长(微米)</param>
/// <returns>雪衰减系数α</returns>
protected override double CalculateSnowAlphaCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.7937;
}
/// <summary>
/// 计算紫外线的总衰减因子
/// </summary>
/// <returns>紫外线总衰减因子</returns>
private double CalculateUVAttenuationFactor()
{
double molecularFactor = CalculateUVMolecularFactor();
double aerosolFactor = CalculateUVAerosolFactor();
double visibilityFactor = CalculateVisibilityFactor();
return molecularFactor * aerosolFactor * visibilityFactor;
}
/// <summary>
/// 计算紫外线的分子散射因子
/// </summary>
/// <returns>紫外线分子散射因子</returns>
private double CalculateUVMolecularFactor()
{
// UV分子散射比可见光更强
return (Pressure / 1013.25) * (288.15 / Temperature) * 2.0;
}
/// <summary>
/// 计算紫外线的气溶胶散射因子
/// </summary>
/// <returns>紫外线气溶胶散射因子</returns>
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);
}
/// <summary>
/// 计算雾对紫外线的衰减
/// </summary>
/// <param name="pathLength">传输路径长度(米)</param>
/// <returns>雾对紫外线的衰减</returns>
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;
}
}
}