重新移植,使用Eigen库
时间: 2024-11-29 10:37:26 浏览: 28
如果你想使用Eigen库而不是Boost.Geometry来处理三维向量,Eigen是一个强大的矩阵和向量库,非常适合数值计算。以下是将上述函数移植到C++,使用Eigen库的版本:
```cpp
#include <Eigen/Dense>
#include <cmath>
double calculateDopplerFreqOffset(Eigen::Vector3d satPos, Eigen::Vector3d satVel, Eigen::Vector3d targetPos, Eigen::Vector3d tarVel, double freqGHz) {
// 创建向量对象
Eigen::Vector3d sat_vec = satPos;
Eigen::Vector3d tar_vec = targetPos;
Eigen::Vector3d sat2tar_vec = tar_vec - sat_vec; // 星终端连线向量r
// 向量速度计算
Eigen::Vector3d sat_vel = satVel;
Eigen::Vector3d tar_vel = tarVel;
double theta0 = std::acos(std::dot(sat_vec, sat_vel) / (sat_vec.norm() * sat_vel.norm())); // 单位向量之间的夹角,无deg
double v0 = sat_vel.norm() * cos(theta0); // 卫星速度在星终端连线上的分量
if (!tar_vel.isZero()) {
double theta1 = std::acos(std::dot(sat2tar_vec, tar_vel) / (sat2tar_vec.norm() * tar_vel.norm()));
double v1 = tar_vel.norm() * cos(theta1); // 终端速度在星终端连线上的分量
} else {
v1 = 0;
}
// 计算多普勒频移
double fre_offset = freqGHz * 1e9 / (const double)Eigen::pow(10, 8) * (v1 - v0); // 使用Eigen库的pow函数代替python的乘法
return fre_offset;
}
```
在这个版本中,我们使用了Eigen库的`Vector3d`类和相应的向量操作。例如,`std::acos`、`norm()`和`isZero()`都是Eigen提供的函数。同样,你需要在适当的地方包含Eigen库。
阅读全文