#include "altitude_calculator.hpp" #include #include #include // 物理常数 constexpr float STANDARD_GRAVITY = 9.80665f; // 标准重力加速度 (m/s²) constexpr float MOLAR_MASS_AIR = 0.0289644f; // 空气摩尔质量 (kg/mol) constexpr float UNIVERSAL_GAS_CONSTANT = 8.3144598f; // 通用气体常数 (J/(mol·K)) constexpr float STANDARD_TEMPERATURE = 288.15f; // 标准温度 (K) = 15°C constexpr float LAPSE_RATE = 0.0065f; // 温度递减率 (K/m) AltitudeCalculator::AltitudeCalculator(float sea_level_pressure) : sea_level_pressure_(sea_level_pressure) { // 验证输入参数 if (!isValidPressure(sea_level_pressure)) { std::cerr << "警告:海平面气压值 " << sea_level_pressure << " hPa 可能超出合理范围。使用默认值 1013.25 hPa。" << std::endl; sea_level_pressure_ = 1013.25f; } } float AltitudeCalculator::calculateAltitude(float pressure) const { if (!isValidPressure(pressure)) { std::cerr << "错误:无效的气压值 " << pressure << " hPa" << std::endl; return 0.0f; } return barometricFormula(pressure, sea_level_pressure_); } float AltitudeCalculator::calculateRelativeHeight(float current_altitude, float base_altitude) { return current_altitude - base_altitude; } void AltitudeCalculator::setSeaLevelPressure(float pressure) { if (isValidPressure(pressure)) { sea_level_pressure_ = pressure; std::cout << "海平面气压已更新为: " << pressure << " hPa" << std::endl; } else { std::cerr << "错误:无效的海平面气压值 " << pressure << " hPa" << std::endl; } } float AltitudeCalculator::metersToFeet(float meters) { return meters * 3.28084f; } float AltitudeCalculator::feetToMeters(float feet) { return feet * 0.3048f; } bool AltitudeCalculator::isValidPressure(float pressure) { // 合理的气压范围:300 hPa (约9000米高度) 到 1100 hPa (海平面以下) return pressure >= 300.0f && pressure <= 1100.0f; } bool AltitudeCalculator::isValidAltitude(float altitude) { // 合理的高度范围:-500米 (地下) 到 9000米 (珠峰高度) return altitude >= -500.0f && altitude <= 9000.0f; } float AltitudeCalculator::barometricFormula(float pressure, float sea_level_pressure) { if (pressure <= 0.0f || sea_level_pressure <= 0.0f) { return 0.0f; } // 气压高度公式(国际标准大气模型) // h = (T0 / L) * (1 - (P / P0)^(R*L / (g*M))) // 防止除以零 if (LAPSE_RATE == 0.0f) { return 0.0f; } // 计算压力比 float pressure_ratio = pressure / sea_level_pressure; // 检查压力比是否合理 if (pressure_ratio <= 0.0f) { return 0.0f; } // 计算指数部分 float exponent = (UNIVERSAL_GAS_CONSTANT * LAPSE_RATE) / (STANDARD_GRAVITY * MOLAR_MASS_AIR); // 计算高度 float altitude = (STANDARD_TEMPERATURE / LAPSE_RATE) * (1.0f - std::pow(pressure_ratio, exponent)); // 验证计算结果 if (!isValidAltitude(altitude)) { std::cerr << "警告:计算出的高度值 " << altitude << " 米可能超出合理范围。" << std::endl; } return altitude; }