【问题标题】:Incorrect Polar - Cartesian Coordinate Conversions. What does -0 Mean?不正确的极坐标 - 笛卡尔坐标转换。 -0 是什么意思?
【发布时间】:2015-06-22 14:52:11
【问题描述】:

从极坐标到笛卡尔坐标的转换不正确,反之亦然。我的代码会产生奇怪的点,例如 (1,-0)。我使用this 计算器检查我的转换。当我转换回笛卡尔坐标时,其中一种转换也是完全错误的。

点 b:(0,1) => (1,1.5708) => (0,0)

#include <math.h>
#include <iostream>
/* Title:      Polar - Cartesian Coordinate Conversion
*  References: HackerRank > All Domains > Mathematics > Geometry > Polar Angles
*              Cartesian to Polar: (radius = sqrt(x^2 + y^2), theta = atan(y/x))
*              Polar to Cartesian: (x = radius*cos(theta), y = radius*sin(theta))
*/

//General 2D coordinate pair
struct point{
    point(float a_val, float b_val) : a(a_val), b(b_val){;};
    point(void){;};
    float a, b;
};
//Converts 2D Cartesian coordinates to 2D Polar coordinates 
point to_polar(/*const*/ point& p){//*** Conversion of origin result in (r, -nan) ***
    point ans(sqrt(pow(p.a,2) + pow(p.b,2)), atan(p.b/p.a));
    return ans;
}
//Converts 2D Polar coordinates to 2D Cartesian coordinates
point to_cartesian(/*const*/ point& p){
    point ans(p.a * cos(p.b), p.a * sin(p.b));
    return ans;
}
//Outputs 2D coordinate pair
std::ostream& operator<<(std::ostream& stream, const point& p){
    stream << "(" << p.a << "," << p.b << ")";
    return stream;
}
int main(){
    //Test Points - Cartesian
    point a(0, 0);
    point b(0, 1);
    point c(1, 0);
    point d(0,-1);
    point e(-1,0); 

    //Print Cartesian/Rectangular points
    std::cout << "Cartesian Coordinates:" << std::endl;
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << d << std::endl;
    std::cout << e << std::endl; 

    //Print Cartesian to Polar
    std::cout << "Polar Coordinates:" << std::endl;
    std::cout << to_polar(a) << std::endl;//Failure (0,-nan)         
    std::cout << to_polar(b) << std::endl;//Success
    std::cout << to_polar(c) << std::endl;//Success
    std::cout << to_polar(d) << std::endl;//Success
    std::cout << to_polar(e) << std::endl;//Failure (1,-0)  

    //Print Polar to Cartesian
    std::cout << "Cartesian Coordinates:" << std::endl;
    std::cout << to_cartesian(a) << std::endl;//Success
    std::cout << to_cartesian(b) << std::endl;//Failure (0,0)
    std::cout << to_cartesian(c) << std::endl;//Success
    std::cout << to_cartesian(d) << std::endl;//Failure (0,-0)
    std::cout << to_cartesian(e) << std::endl;//Failure (-1,-0)


    return 0;
}

【问题讨论】:

  • 您多次被零除。
  • @molbdnilo:按照我的建议切换到atan2 也可以解决这个问题。
  • 关于何时使用atan2 的很好的讨论在这里找到:stackoverflow.com/a/12011762/1923699

标签: c++ polar-coordinates cartesian-coordinates


【解决方案1】:

您正在将已经在笛卡尔坐标中的点转换为笛卡尔坐标。你想要的是:

std::cout << "Cartesian Coordinates:" << std::endl;
std::cout << to_cartesian(to_polar(a)) << std::endl;
std::cout << to_cartesian(to_polar(b)) << std::endl;
//...

编辑: 使用 atan2 解决了 NaN 问题,(0, 0) 被转换为 (0, 0) 这很好。

【讨论】:

  • 所以,你是说要转换成极地我这样做? std::cout &lt;&lt; to_cartesian(to_polar(a)) &lt;&lt; std::endl;
  • @dylan 转换为使用to_polar 的极坐标,要转换回笛卡尔坐标,您应该保存to_polar 的结果,即a1 = to_polar(a); a2 = to_cartesian(a1); 或使用to_cartesian(to_polar(a))
  • 当我这样做时,坐标是正确的。它输出零作为一个非常小的数字。例如:(-4.37114e-08,1)。有什么办法可以解决这个问题。
  • @dylan 提高精度使用double。但无论如何你不会得到零。要获得不错的输出,请尝试std::cout.setf(std::ios::fixed);
【解决方案2】:

第一步,您需要在转换为极坐标时切换到atan2 而不是atanatan 给出了一半飞机的错误结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多