首页 > 解决方案 > Eigen C++:将 2D 极坐标转换为笛卡尔坐标的最佳方法

问题描述

我目前正在做:

Eigen::Vector2d polar(2.5, 3 * M_PI / 4);
Eigen::Vector2d cartesian = polar.x() * Vector2d(cos(polar.y()), sin(polar.y()));

但我不确定这是否是使用 Eigen 的正确方法,或者是否有更好的内置方法。

谢谢!

标签: c++eigen3

解决方案


如果您想坚持使用 Eigen,这对我来说是正确的。

一般来说,虽然由于极坐标表示有角度,但为了减少将来可能犯的错误,最好避免使用Eigen::Vector2djust (例如将多个角度加在一起而不处理 0 == 2*PI 的事实)。也许你可以用结构来代替:

struct Polar { double range; double angle; };
struct Cartesian { double x; double y; };

Cartesian to_cartesian(const Polar& p) {
    double c = cos(p.angle);
    double s = sin(p.angle);
    return {p.range * c, p.range * s};
}

Polar to_polar(const Cartesian& c) {
    return {std::sqrt(c.x * c.x + c.y * c.y), std::atan2(c.y, c.x)};
}

推荐阅读