2025-05-31 15:28:41 +00:00
|
|
|
|
#include "standardglobe.h"
|
2025-06-01 14:37:26 +00:00
|
|
|
|
#include <math.h>
|
2025-05-31 15:28:41 +00:00
|
|
|
|
|
2025-06-01 14:37:26 +00:00
|
|
|
|
double StandardGlobe::_radius_m = 65000000;
|
2025-05-31 15:28:41 +00:00
|
|
|
|
StandardGlobe::StandardGlobe()
|
|
|
|
|
{
|
|
|
|
|
}
|
2025-06-01 14:37:26 +00:00
|
|
|
|
|
|
|
|
|
ECEFPos StandardGlobe::llaToEcef(const LLAPos& v)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
|
|
|
|
|
auto axis_r_g = v._alt_m + _radius_m;
|
|
|
|
|
// ecef-z<><7A><EFBFBD><EFBFBD>
|
|
|
|
|
auto axis_z = axis_r_g * sin(v._lat_deg);
|
|
|
|
|
// γ<><CEB3>Ȧ<EFBFBD>뾶
|
|
|
|
|
auto axis_r_lat = axis_r_g * cos(v._lat_deg);
|
|
|
|
|
// ecef-x
|
|
|
|
|
auto axis_x = axis_r_g * cos(v._lon_deg);
|
|
|
|
|
// ecef-y
|
|
|
|
|
auto axis_y = axis_r_g * sin(v._lon_deg);
|
|
|
|
|
|
|
|
|
|
return ECEFPos{ axis_x, axis_y, axis_z };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void StandardGlobe::getDistanceWithin(const LLAPos& base, const LLAPos& target, double dist, double azi)
|
|
|
|
|
{
|
|
|
|
|
// ecefʸ<66><CAB8>
|
|
|
|
|
auto vec_base = llaToEcef(base).getVec3();
|
|
|
|
|
auto vec_target = llaToEcef(target).getVec3();
|
|
|
|
|
auto vec_bn = vec_base.normalized();
|
|
|
|
|
auto vec_tn = vec_target.normalized();
|
|
|
|
|
|
|
|
|
|
// Ŀ<><C4BF>ƽ<EFBFBD>淨<EFBFBD><E6B7A8>ʸ<EFBFBD><CAB8>
|
|
|
|
|
auto vec_vn = QVector3D::crossProduct(vec_bn, vec_tn).normalized();
|
|
|
|
|
// Ŀ<><C4BF>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>
|
|
|
|
|
auto vec_hn = QVector3D::crossProduct(vec_vn, vec_bn).normalized();
|
|
|
|
|
// <20><>ʼ<EFBFBD>н<EFBFBD>cosֵ
|
|
|
|
|
auto cos_angle = QVector3D::dotProduct(vec_hn, QVector3D(0, 0, 1));
|
2025-06-01 14:37:46 +00:00
|
|
|
|
auto angle = acos(cos_angle);
|
2025-06-01 14:37:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVector3D ECEFPos::getVec3() const
|
|
|
|
|
{
|
|
|
|
|
return QVector3D(_x_pos, _y_pos, _z_pos);
|
|
|
|
|
}
|