99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
#include "altitude_calculator.hpp"
|
||
#include <cmath>
|
||
#include <iostream>
|
||
#include <limits>
|
||
|
||
// 物理常数
|
||
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;
|
||
} |