如何使用Turtle库绘制点状万花尺 代码运行后原地打转如何修复
问题根因
代码核心问题出在draw_dotted_circle函数的状态处理逻辑:函数执行完成后没有将海龟的位置、朝向重置为调用前的初始状态,每次绘制下一个偏移角度的圆时,都会基于上一次绘制结束时的错位状态继续执行,多次偏移叠加后就会出现同位置持续螺旋绘制的异常。
排查步骤
- 打印每次调用
draw_dotted_circle前后的海龟坐标chinky.pos()和朝向chinky.heading(),可确认每次函数执行后,海龟没有回到画布原点,朝向也发生了随机偏移 - 单独调用一次
draw_dotted_circle(100,5)验证,确认单次执行后海龟状态未复位的问题
修复代码
只需要修改draw_dotted_circle函数,在绘制前保存海龟状态,绘制完成后恢复即可,完整修复后的代码如下:
from turtle import Turtle, done from math import pi, copysign chinky = Turtle() colours = ["DeepPink2", "DarkTurquoise", "chartreuse3", "CornflowerBlue"] j = 0 def draw_spirograph(size_of_gap, radius): global j for i in range(int(360 / size_of_gap)): chinky.color(colours[j]) if j < 3: j += 1 else: j = 0 draw_dotted_circle(radius, 5) chinky.setheading(chinky.heading() + size_of_gap) def draw_dotted_circle(radius, dot_size): # 保存绘制前的海龟状态 original_pos = chinky.pos() original_heading = chinky.heading() chinky.penup() # 重置朝向为0,保证每次画圆的初始朝向一致 chinky.setheading(0) chinky.sety(radius) diameter = 2 * radius circumference = pi * diameter dot_extent = 360 * dot_size / circumference # diameter to angle times_y_crossed = 0 x_sign = 1 while times_y_crossed < 2: chinky.dot(dot_size) # draw the dot chinky.right(dot_extent) chinky.forward(dot_size) chinky.right(dot_extent) # draw the gap chinky.forward(dot_size) x_sign_new = copysign(1, chinky.xcor()) if x_sign_new != x_sign: times_y_crossed += 1 x_sign = x_sign_new chinky.pendown() # 恢复绘制前的海龟状态 chinky.setpos(original_pos) chinky.setheading(original_heading) chinky.speed("fastest") draw_spirograph(5, 100) done()
内容的提问来源于stack exchange,提问作者niharika gadde
相关产品推荐
相关产品推荐

