3、二维坐标系:笛卡尔坐标系、极坐标系、坐标系之间的转换关系
说到二维坐标系,这可能是你接触图形学、机器人学或者游戏开发时,第一个要打交道的数学工具。我个人习惯把二维坐标系比作「地图上的两种语言」——一种用横平竖直的网格说话,另一种用距离和角度来表达。今天我们就来聊聊这两种语言,以及它们之间怎么互相翻译。
3.1 笛卡尔坐标系:最熟悉的陌生人
笛卡尔坐标系,说白了就是你在初中数学课上画的那个 x-y 轴。一个点用 (x, y) 表示,x 是水平方向的位置,y 是垂直方向的位置。简单、直观、好理解。
但我在项目中遇到过一个问题:很多初学者以为笛卡尔坐标系只有一种。其实不然。在计算机图形学里,屏幕坐标系和数学坐标系是反的——y 轴朝下。嗯,这里要注意,如果你在做 UI 开发或者图像处理,千万别搞混了。
核心要点:
- 原点 O(0, 0) 是坐标系的基准点
- x 轴和 y 轴互相垂直,构成一个平面
- 任意点 P 可以表示为 (x, y),其中 x 和 y 是实数
3.2 极坐标系:换个角度看世界
极坐标系就不太一样了。它用两个值来描述一个点:一个是到原点的距离 r(半径),另一个是从正 x 轴逆时针旋转的角度 θ(通常用弧度表示)。
你想想看,有些场景用笛卡尔坐标描述起来很麻烦,比如一个旋转的机械臂末端位置。用极坐标就简单多了——直接说「距离中心 2 米,角度 30 度」就完事了。
我曾经在做一个雷达数据可视化项目时,发现用笛卡尔坐标处理扫描数据简直是噩梦。后来换成极坐标,代码量直接砍了一半。这就是选对工具的好处。
小技巧:极坐标中的角度 θ 通常用弧度制。0 弧度对应正 x 轴,π/2 对应正 y 轴,π 对应负 x 轴,3π/2 对应负 y 轴。记住这个,转换的时候不容易出错。
3.3 坐标系之间的转换
好了,现在问题来了:你手里有一个点的极坐标 (r, θ),但你的程序只认笛卡尔坐标 (x, y),怎么办?反过来也一样。这时候就需要转换公式了。
3.3.1 极坐标 → 笛卡尔坐标
这个转换很简单,用三角函数就行:
x = r * cos(θ)
y = r * sin(θ)
举个例子:点 P 的极坐标为 (5, 30°),注意这里要把 30° 转成弧度 π/6。那么:
x = 5 * cos(π/6) ≈ 5 * 0.866 = 4.33
y = 5 * sin(π/6) ≈ 5 * 0.5 = 2.5
所以对应的笛卡尔坐标大约是 (4.33, 2.5)。
3.3.2 笛卡尔坐标 → 极坐标
反过来稍微复杂一点:
r = sqrt(x² + y²)
θ = atan2(y, x)
这里我特别想强调一下 atan2 这个函数。很多新手会用 atan(y/x),但这样会出问题——当 x 为 0 时直接崩溃,而且无法区分点是在第一象限还是第三象限。atan2 完美解决了这个问题,它会根据 x 和 y 的符号自动判断角度所在的象限。
避坑指南:我曾经在写一个机器人路径规划算法时,用了 atan 而不是 atan2,结果机器人在 x 轴负半轴附近疯狂抖动。排查了整整一天才发现是角度计算错了。从那以后,我所有涉及坐标转换的代码,一律用 atan2。
3.4 知识体系结构图
下面我用一张 SVG 图来总结本章的核心内容,帮你理清思路:
3.5 实际应用中的选择
那么问题来了:什么时候用笛卡尔坐标,什么时候用极坐标?
我个人经验是这样的:
- 笛卡尔坐标:适合描述直线运动、矩形区域、网格布局。比如游戏中的地图坐标、UI 元素的位置、图像像素坐标。
- 极坐标:适合描述旋转运动、圆形区域、方向性数据。比如雷达扫描、机械臂关节角度、天体运动轨迹。
其实很多系统是两者混用的。比如一个机器人,它的全局路径规划用笛卡尔坐标,但每个关节的控制用极坐标(角度)。你想想看,这就是坐标系转换在实际工程中的价值。
总结一下:
- 笛卡尔坐标 (x, y) 直观,适合直线和网格场景
- 极坐标 (r, θ) 自然,适合旋转和距离场景
- 两者可以互相转换,公式要记牢
- 转换时务必使用
atan2而不是atan
好了,二维坐标系的内容就聊到这里。记住,坐标系只是工具,选对了事半功倍,选错了...嗯,你可能就要像我一样熬夜排查 bug 了。