C++ 以指定点为原点转换笛卡尔坐标为极坐标实现问题
代码问题诊断与修正方案
你的实现存在多处逻辑错误,无法完成相对极坐标转换需求,具体问题和修正方案如下:
存在的问题
- 相对坐标计算方向错误:将点i设为新原点时,点j相对i的笛卡尔坐标应为
(points[j].x - points[i].x, points[j].y - points[i].y),你的代码使用加法计算,完全颠倒了平移方向。 - 过滤条件逻辑错误:现有判断
points[i].x != points[j].x && points[i].y != points[j].y会跳过所有和原点i有单个坐标相等的点,正确逻辑仅需跳过i和j为同一点的情况。 - 极角计算存在象限错误:
atan(y/x)无法正确识别第二、第三象限的角度,比如x=-1、y=1时,atan(y/x)返回-45度,实际极角应为135度,需改用atan2(y, x)函数自动处理四象限判断。 - 计算结果未保存:所有转换结果都存在临时变量
temp中,循环结束后直接被销毁,没有留存任何有效输出。 - π值精度不足:硬编码的3.1416精度较低,建议使用标准库的高精度π常量。
修正后的代码
自定义point结构体
#define _USE_MATH_DEFINES #include <cmath> #include <string> using namespace std; struct point { float x; float y; string type; static constexpr float toDegrees = 180.0f / static_cast<float>(M_PI); point(float x, float y) : x(x), y(y) {} };
坐标转换逻辑
你可以用二维vector存储每个点作为原点时的所有相对极坐标,示例代码如下:
#include <vector> using namespace std; // 存储转换结果,第一维是原点序号,第二维是对应其他点的极坐标 vector<vector<point>> polar_results(points.size()); for (int i = 0; i < points.size(); i++) { // 取points[i]作为当前新原点 const point& origin = points[i]; for (int j = 0; j < points.size(); j++) { // 跳过原点自身 if (i == j) continue; // 计算相对笛卡尔坐标 float rel_x = points[j].x - origin.x; float rel_y = points[j].y - origin.y; // 转换为极坐标 float r = sqrt(pow(rel_x, 2) + pow(rel_y, 2)); float theta = atan2(rel_y, rel_x) * point::toDegrees; // 把角度调整到0~360度区间 if (theta < 0) theta += 360.0f; // 保存结果 polar_results[i].emplace_back(r, theta); } }
内容的提问来源于stack exchange,提问作者Mateoglzc
相关产品推荐
相关产品推荐

