CppGenerate/src/altitude_calculator.cpp

99 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}