SimsWorld/StandardGlobe/standardglobe.h

109 lines
2.5 KiB
C
Raw Normal View History

2025-05-31 15:28:41 +00:00
#pragma once
#include "standardglobe_global.h"
2025-06-07 08:44:25 +00:00
2025-06-21 07:56:59 +00:00
#define PI 3.14159265354
#define deg2a(v) v / 180.0 * PI
#define rad2d(v) v / PI * 180.0
2025-06-07 08:44:25 +00:00
class QVector3D;
2025-05-31 15:28:41 +00:00
2025-06-14 05:07:51 +00:00
/// <summary>
/// <20><>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
struct LonLatPos {
double _lon_deg = 0;
double _lat_deg = 0;
};
2025-05-31 15:28:41 +00:00
/// <summary>
2025-06-01 14:37:26 +00:00
/// <20><>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>
2025-05-31 15:28:41 +00:00
/// </summary>
2025-06-21 07:56:59 +00:00
struct STANDARDGLOBE_EXPORT LonLatAlt {
2025-05-31 15:28:41 +00:00
double _lon_deg = 0;
double _lat_deg = 0;
double _alt_m = 0;
2025-06-21 04:54:39 +00:00
2025-06-21 07:56:59 +00:00
LonLatAlt(double lon = 0, double lat = 0, double alt = 0);
LonLatAlt(const LonLatPos& plain_pos);
2025-06-21 04:54:39 +00:00
LonLatPos toLonLatPos() const;
2025-05-31 15:28:41 +00:00
};
2025-06-01 14:37:26 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
/// </summary>
2025-06-21 04:54:39 +00:00
struct ECEFv3d {
2025-06-07 08:44:25 +00:00
double _x_pos = 0;// ָ<><D6B8>0<EFBFBD><EFBFBD><E3BEAD>Ȧ<EFBFBD><C8A6>γ<EFBFBD><CEB3>0<EFBFBD><EFBFBD><E3BDBB>
2025-06-01 14:37:26 +00:00
double _y_pos = 0;
double _z_pos = 0;
2025-06-01 14:37:46 +00:00
QVector3D getVec3() const;
2025-06-21 04:54:39 +00:00
static ECEFv3d fromVec3(const QVector3D& p);
2025-06-01 14:37:26 +00:00
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><ECB1B1><EFBFBD><EFBFBD>ϵ
/// </summary>
2025-06-21 04:54:39 +00:00
struct ENUv3d {
2025-06-01 14:37:26 +00:00
double _e_pos = 0;
double _n_pos = 0;
double _t_pos = 0;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
struct PolarPos {
double _dist_m = 0;
double _azimuth_deg = 0;
double _pitch_deg = 0;
};
2025-05-31 15:28:41 +00:00
/// <summary>
/// <20><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class STANDARDGLOBE_EXPORT StandardGlobe
{
2025-06-01 14:37:26 +00:00
private:
/// <summary>
/// <20><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>
/// </summary>
static double _radius_m;
2025-05-31 15:28:41 +00:00
public:
2025-06-01 14:37:26 +00:00
StandardGlobe();
2025-06-21 07:56:59 +00:00
static ECEFv3d llaToEcef(const LonLatAlt& v);
static LonLatAlt ecefToLLA(const ECEFv3d& v);
2025-06-07 07:11:48 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD>LLA<4C><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>Ⱥ<EFBFBD>b->t<><74>ʼ<EFBFBD><CABC>λ<EFBFBD>ǣ<EFBFBD>warning<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LLA<4C>ĸ߶<C4B8>ֵ
/// </summary>
/// <param name="base"></param>
/// <param name="target"></param>
/// <param name="dist"></param>
/// <param name="azi"></param>
2025-06-21 07:56:59 +00:00
static void getDistanceWithTargetLLA(const LonLatAlt& base, const LonLatAlt& target, double& dist, double& azi);
2025-06-07 07:11:48 +00:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>Ⱥ<EFBFBD>b->t<><74>ʼ<EFBFBD><CABC>λ<EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>LLA<4C><41>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
/// </summary>
/// <param name="base"></param>
/// <param name="dist"></param>
/// <param name="azi"></param>
/// <param name="target"></param>
2025-06-21 07:56:59 +00:00
static void getTargetLLAWithDistance(const LonLatAlt& base, double dist, double azi, LonLatAlt& target);
2025-06-07 08:44:25 +00:00
/// <summary>
/// ͨ<><CDA8>LLA<4C><41><EFBFBD><EFBFBD><EAA3AC>ȡĿ<C8A1><EFBFBD><EABCAB><EFBFBD><EFBFBD>
/// </summary>
/// <param name="base"></param>
/// <param name="target"></param>
/// <returns></returns>
2025-06-21 07:56:59 +00:00
static PolarPos getPolarWithLLA(const LonLatAlt& base, const LonLatAlt& target);
2025-06-07 08:44:25 +00:00
/// <summary>
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAA3AC>ȡĿ<C8A1><C4BF>LLA<4C><41><EFBFBD><EFBFBD>
/// </summary>
/// <param name="base"></param>
/// <param name="target"></param>
/// <returns></returns>
2025-06-21 07:56:59 +00:00
static LonLatAlt getLLAWithPolar(const LonLatAlt& base, const PolarPos& target);
2025-05-31 15:28:41 +00:00
};