2. 二维坐标系:笛卡尔坐标系、极坐标系、坐标系之间的转换关系
2.1 笛卡尔坐标系——我们最熟悉的“老朋友”
说起坐标系,大家最先想到的肯定是笛卡尔坐标系。说白了,就是我们在纸上画的那两条互相垂直的线——x轴和y轴。任何一个点,都能用一对数字(x, y)来表示它的位置。
我个人习惯把笛卡尔坐标系想象成一个“网格城市”。x轴是东西向的街道,y轴是南北向的大道。点(3, 5)的意思就是:从市中心出发,向东走3个单位,再向北走5个单位,就到了。
核心要点:笛卡尔坐标系用(x, y)表示位置,适合描述“水平-垂直”关系。在计算机图形学、游戏开发、UI布局中,这是最常用的坐标系。
我在项目中遇到过一个问题:用笛卡尔坐标描述一个旋转的机械臂,计算起来特别麻烦。每次旋转都要重新算一遍所有点的坐标,代码又长又容易出错。后来我换了个思路——用极坐标,问题一下子就简单了。
2.2 极坐标系——换个角度看世界
极坐标系用另一种方式描述点的位置:它用距离和角度来表示。
想象一下:你站在原点,手里拿着一个激光测距仪。你转到一个方向(角度θ),然后测出那个方向上的距离(极径r)。点就定位在(r, θ)处。
举个例子:点(5, 30°)表示从原点出发,沿着30°方向走5个单位。你想想看,这比笛卡尔坐标直观多了吧?尤其是描述圆形、螺旋、旋转运动的时候。
| 坐标系 | 表示方式 | 适合场景 |
|---|---|---|
| 笛卡尔 | (x, y) | 直线运动、网格布局、图像处理 |
| 极坐标 | (r, θ) | 旋转运动、圆形轨迹、雷达扫描 |
小技巧:在Python里用极坐标画圆,代码比笛卡尔坐标简洁得多。我经常用matplotlib的polar投影来画雷达图,一行代码就能搞定。
2.3 坐标系之间的转换——桥接两个世界
实际开发中,我们经常需要在两种坐标系之间来回切换。比如:你用雷达(极坐标)采集数据,但要在屏幕上(笛卡尔坐标)显示。这时候就需要转换公式。
2.3.1 极坐标 → 笛卡尔坐标
公式很简单,用三角函数就行:
x = r * cos(θ)
y = r * sin(θ)
嗯,这里要注意:θ通常用弧度制。如果你习惯用角度,记得先转成弧度。我曾经在这个坑里摔过一次——用角度直接算cos,结果图形全歪了。
2.3.2 笛卡尔坐标 → 极坐标
反过来也一样:
r = sqrt(x² + y²)
θ = atan2(y, x) # 注意用atan2,不是atan
避坑指南:我曾经直接用atan(y/x)计算角度,结果当x=0时程序直接崩溃。后来改用atan2(y, x),它自动处理了x=0和象限判断的问题。记住:永远用atan2,别用atan。
2.4 实战:用Python实现坐标转换
光说不练假把式。我写了个小工具,把两种转换封装成函数,方便复用:
import math
def polar_to_cartesian(r, theta_deg):
"""极坐标转笛卡尔坐标,theta用角度制"""
theta_rad = math.radians(theta_deg)
x = r * math.cos(theta_rad)
y = r * math.sin(theta_rad)
return (x, y)
def cartesian_to_polar(x, y):
"""笛卡尔坐标转极坐标,返回角度用角度制"""
r = math.sqrt(x**2 + y**2)
theta_rad = math.atan2(y, x)
theta_deg = math.degrees(theta_rad)
return (r, theta_deg)
# 示例:把极坐标(10, 45°)转成笛卡尔坐标
print(polar_to_cartesian(10, 45))
# 输出:(7.07, 7.07)
# 示例:把笛卡尔坐标(3, 4)转成极坐标
print(cartesian_to_polar(3, 4))
# 输出:(5.0, 53.13°)
个人习惯:我一般把角度统一用角度制,因为更直观。但在计算时转成弧度,算完再转回来。这样代码可读性好,也不容易出错。
2.5 知识体系总览
下面这张图帮你理清本章的核心逻辑:
2.6 总结
笛卡尔坐标系和极坐标系,就像同一个世界的两种语言。笛卡尔坐标擅长描述“直来直去”的关系,极坐标擅长描述“转圈圈”的关系。两者之间通过三角函数可以自由转换。
我个人建议:做计算时用极坐标,做显示时用笛卡尔坐标。这样代码既简洁又高效。你想想看,描述一个旋转的圆盘,用极坐标只需要改角度θ,用笛卡尔坐标就得重新算一堆x和y,多麻烦。
下一章我们会深入三维坐标系,到时候你会发现,二维的这些概念都是基础。把二维吃透了,三维就是加个z轴的事。