CppGenerate/src/altitude_calculator.cpp

99 lines
3.3 KiB
C++
Raw Normal View History

2026-04-17 09:17:56 +00:00
#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;
}