Python Turtle 画圆时的圆心位置问题

问题:在使用 turtle.circle() 画圆时,发现圆心在 turtle 的正上方。

这个 API 的参数里没有指定圆心,也不是以当前位置 turtle.position() 为圆心。turtle.circle() 是这样定义的:

turtle.circle(radius, extent=None, steps=None)

Parameters
    radius – a number
    extent – a number (or None)
    steps – an integer (or None)

Draw a circle with given radius. The center is radius units left of the turtle; extent – an angle – determines which part of the circle is drawn. If extent is not given, draw the entire circle. If extent is not a full circle, one endpoint of the arc is the current pen position. Draw the arc in counterclockwise direction if radius is positive, otherwise in clockwise direction. Finally the direction of the turtle is changed by the amount of extent.

也就是说,圆心在 turtle 的左侧、半径远处。这跟实际调试中的圆心在 turtle 的正上方、半径远处的现象就不一致了。

调试过程及解决:

在 Turtle graphics 编程里,turtle 是有状态的,包括位置 position() | pos() 和方向 heading()。所以正确的理解是,圆心在当前方向 heading 下、左侧半径远处(注意:这是 radius 大于 0 的情况下;如果小于 0,就是在右侧了);turtle 从当前 position 出发,绕圆心以指定半径画一个圆,期间 heading 一直会改变,最终回到起始位置,并恢复到出发时的 heading。当然,如果 extent 不为 360 度时,按实际情况决定。仔细想一下,这样的设计,符合从 turtle 的状态和发生动作的视角。

之前发生的问题,是因为这一时刻的方向问题,因为初始方向是向东(0 度),所以圆心就在正上方了。正确设置方向,问题可以解决。

另外,为什么不以当前位置 position() 为圆心?如果是这样,那么就有从当前位置跳到半径远处的动作,但这个动作跟画一个圆本身并没有关系,如果作为 turtle.circle() 的一部分,是不合理的。

所以 Turtle graphics 里要时刻注意当前的状态,以及每一个 API 会改变哪些状态。

参考资料

Read More: