杰瑞科技汇

Python turtle坐标系原点与方向如何确定?

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

Python turtle坐标系原点与方向如何确定?-图1
(图片来源网络,侵删)

核心概念:海龟的视角

想象你手里有一只小海龟,它有一支笔,所有绘图命令都是从这只海龟的视角出发的。


坐标系原点和初始方向

  • 原点: 当你启动 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)

示例代码:

Python turtle坐标系原点与方向如何确定?-图2
(图片来源网络,侵删)
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 的第一步,多动手画一些简单的图形,比如正方形、三角形,很快你就能熟练掌握它了!

分享:
扫描分享到社交APP
上一篇
下一篇