自从我最近了解了“Turtle”库以来,我编写了一些打印形状的代码,这些代码确实不是完美无缺的。这是我的代码:
from turtle import *
for i in range(8):
forward(100)
left(45)
f = 50
turns = [(40,40),(90, 40), (80, 40), (90, 40), (90, 50), (90, 40), (80, 40), (90, 40)]
forward(f)
for l_angle, r_angle in turns:
left(l_angle)
forward(f)
right(r_angle)
forward(f)
但是上面的代码只打印了我想要制作的形状的一部分。我也不知道如何找到形状中心点的坐标。我想要制作的形状的图像将包括在内。
最终形状:
代码形成的形状:
我尝试了很多角度,甚至
penup
命令来到达中心,但这非常困难,因为我不知道乌龟必须前进多少。而且它永远不会落在我形状的中心。
三点提示:
一步一步来,你可能会关注最里面的8个菱形的重复图案。首先简单地绘制一个菱形:
import turtle
t = turtle.Turtle()
t.forward(50)
t.left(45)
t.forward(50)
t.right(225)
t.forward(50)
t.left(45)
t.forward(50)
turtle.exitonclick()
现在计算出在一个圆中画8个菱形的旋转:
for _ in range(8):
t.forward(50)
t.left(45)
t.forward(50)
t.right(225)
t.forward(50)
t.left(45)
t.forward(50)
t.left(180) # prepare for the next rhombus
现在内部形状已经完成,我认为下一步最好是向外绘制下一层的 8 个正方形。但我注意到,如果我画 8 个外部菱形,这些正方形无论如何都会被画出来,所以我可以跳过它们并直接进入最后一步。
t.penup()
t.forward(120)
t.pendown()
t.left(90)
t.forward(50)
t.left(45)
t.forward(50)
t.right(225)
t.forward(50)
t.left(45)
t.forward(50)
现在我们有了一个边菱形,我们需要将其推广为循环,这意味着将海龟重新定位回原点:
t.left(45)
t.penup()
t.backward(120)
t.pendown()
最后,像以前一样,添加必要的循环和转动,以使乌龟指向下一个形状的正确方向:
for _ in range(8):
t.penup()
t.forward(120)
t.pendown()
t.left(90)
t.forward(50)
t.left(45)
t.forward(50)
t.right(225)
t.forward(50)
t.left(45)
t.forward(50)
t.left(45)
t.penup()
t.backward(120)
t.pendown()
t.left(45)
清理并概括:
import turtle
def draw_rhombus():
t.forward(size)
t.left(45)
t.forward(size)
t.left(135)
t.forward(size)
t.left(45)
t.forward(size)
t = turtle.Turtle()
t.speed("fastest")
t.pensize(4)
size = 100
long_size = size * 2.4
for _ in range(8):
draw_rhombus()
t.left(180)
for _ in range(8):
t.penup()
t.forward(long_size)
t.pendown()
t.left(90)
draw_rhombus()
t.left(45)
t.penup()
t.backward(long_size)
t.pendown()
t.left(45)
turtle.exitonclick()
作为海龟特定的旁注,请避免
from turtle import *
,因为这会用超过 150 个函数淹没全局命名空间,从而导致错误和名称冲突。我也总是创建一个乌龟实例,以避免由功能接口引起的混乱和错误。