turtle 使用的是一个二维笛卡尔坐标系,但它有几个非常独特的特点,与传统数学坐标系略有不同。

核心概念:海龟的视角
想象你手里有一只小海龟,它有一支笔,所有绘图命令都是从这只海龟的视角出发的。
坐标系原点和初始方向
- 原点: 当你启动
turtle时,海龟的初始位置在画布的中心,这个中心点就是坐标系的原点(0, 0)。 - 初始方向: 海龟的初始朝向是向右(东方),这个方向对应于数学坐标系中的正 X 轴方向。
X轴和Y轴
- X轴 (水平轴):
- 正方向: 向右 (海龟的初始方向)。
- 负方向: 向左。
- Y轴 (垂直轴):
- 正方向: 向上。
- 负方向: 向下。
注意:这一点与数学坐标系一致。
坐标单位
turtle使用的默认单位是像素,当你说turtle.goto(100, 50)时,意思就是让海龟从原点向右移动 100 像素,再向上移动 50 像素。
坐标获取和设置
你可以通过以下函数来获取或设置海龟的坐标:
获取坐标
turtle.xcor(): 返回海龟当前 X 坐标。turtle.ycor(): 返回海龟当前 Y 坐标。turtle.position()或turtle.pos(): 返回一个包含 (x, y) 坐标的元组。
设置坐标
turtle.setx(x): 将海龟的 X 坐标设置为x,Y 坐标保持不变。turtle.sety(y): 将海龟的 Y 坐标设置为y,X 坐标保持不变。turtle.goto(x, y)或turtle.setposition(x, y): 将海龟的坐标直接设置为(x, y)。
示例代码:

import turtle
# 创建一个海龟对象
t = turtle.Turtle()
# 获取初始坐标 (应该是 0, 0)
print(f"初始位置: {t.pos()}")
# 移动海龟到 (100, 50)
t.goto(100, 50)
print(f"移动后位置: {t.pos()}")
# 只改变Y坐标,移动到 (100, 100)
t.sety(100)
print(f"sety后位置: {t.pos()}")
# 只改变X坐标,移动到 (-50, 100)
t.setx(-50)
print(f"setx后位置: {t.pos()}")
# 保持窗口打开
turtle.done()
角度系统(海龟的方向)
这是 turtle 坐标系中与数学坐标系最大的不同点。
- 0度: 海龟的初始方向,向右 (东)。
- 90度: 向上 (北)。
- 180度: 向左 (西)。
- 270度: 向下 (南)。
- 360度: 又回到了向右 (东)。
顺时针旋转为负角度,逆时针旋转为正角度。
这与数学中“逆时针为正,顺时针为负”的坐标系完全相反!
控制方向的函数
turtle.setheading(angle)或turtle.seth(angle): 将海龟的朝向设置为angle度。turtle.left(angle): 海龟逆时针旋转angle度。turtle.right(angle): 海龟顺时针旋转angle度。
示例代码:
import turtle t = turtle.Turtle() t.speed(1) # 设置速度为1,便于观察 # 初始方向:向右 (0度) t.forward(100) # 画一条向右的线 # 向左转90度,现在朝向是向上 (90度) t.left(90) t.forward(100) # 画一条向上的线 # 设置方向为向左 (180度) t.setheading(180) t.forward(100) # 画一条向左的线 # 向右转90度,现在朝向是向下 (270度) t.right(90) t.forward(100) # 画一条向下的线 turtle.done()
画布坐标系 vs. 海龟坐标系
我们需要知道海龟在整个画布中的位置,而不仅仅是相对于原点的位置。
- 画布大小: 你可以使用
turtle.screensize(width, height)或turtle.setup(width, height)来设置画布的大小。 - 画布坐标: 画布的左上角坐标是
(0, screensize_height),右下角坐标是(screensize_width, 0),原点(0, 0)仍然在画布中心。
示例代码:
import turtle
# 设置画布大小为 800x600 像素
turtle.setup(800, 600)
# 获取画布大小
screen = turtle.Screen()
width, height = screen.screensize()
print(f"画布大小: {width} x {height}")
# 获取海龟在画布上的绝对坐标
# (相对于画布左上角)
print(f"海龟在画布上的坐标: {t.xcor() + width/2}, {height/2 - t.ycor()}")
t = turtle.Turtle()
t.goto(200, 150)
print(f"海龟在画布上的新坐标: {t.xcor() + width/2}, {height/2 - t.ycor()}")
turtle.done()
实用技巧:显示坐标和角度
在调试时,如果能在画布上实时看到海龟的坐标和角度会非常方便。
turtle.write(): 在海龟当前位置写入文本。turtle.shape(): 可以将海龟的形状从箭头改为 "circle"(圆点),这样就不会干扰你观察画线。
示例代码:
import turtle
t = turtle.Turtle()
t.shape("circle") # 将海龟变成一个圆点
t.speed(0) # 最快速度
def show_info():
"""在当前位置显示坐标和角度信息"""
info = f"Pos:({t.xcor():.0f}, {t.ycor():.0f})\nHeading: {t.heading():.0f}°"
t.write(info, align="center", font=("Arial", 12, "normal"))
# 初始状态
show_info()
# 向右移动
t.goto(100, 0)
show_info()
# 向上移动并转向
t.left(90)
t.forward(100)
show_info()
turtle.done()
| 特性 | 描述 |
|---|---|
| 原点 | 画布中心 (0, 0) |
| 初始方向 | 向右 (0度) |
| X轴 | 向右为正,向左为负 |
| Y轴 | 向上为正,向下为负 |
| 角度系统 | 顺时针为负,逆时针为正 (与数学相反) |
| 0度 | 向右 (东) |
| 90度 | 向上 (北) |
| 180度 | 向左 (西) |
| 270度 | 向下 (南) |
理解这个独特的坐标系是玩转 turtle 的第一步,多动手画一些简单的图形,比如正方形、三角形,很快你就能熟练掌握它了!
