使用 Turtle Library 完成打印形状的代码

问题描述 投票:0回答:1

自从我最近了解了“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)

但是上面的代码只打印了我想要制作的形状的一部分。我也不知道如何找到形状中心点的坐标。我想要制作的形状的图像将包括在内。

最终形状:
Final Shape

代码形成的形状:
The shape i currently made with codes above

我尝试了很多角度,甚至

penup
命令来到达中心,但这非常困难,因为我不知道乌龟必须前进多少。而且它永远不会落在我形状的中心。

python turtle-graphics python-turtle
1个回答
0
投票

三点提示:

  1. 将大问题分解为更小的子问题,而不是尝试一次性绘制整个形状。
  2. 专注于您可以利用的旋转对称性。
  3. 不要立即使用列表之类的抽象——从硬编码、WET、显式、幼稚的命令开始,然后仅当您确定找到了值得抽象的模式时才编写函数和使用列表。这就是所谓的“AHA”——避免仓促的抽象。

一步一步来,你可能会关注最里面的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 个函数淹没全局命名空间,从而导致错误和名称冲突。我也总是创建一个乌龟实例,以避免由功能接口引起的混乱和错误。

© www.soinside.com 2019 - 2024. All rights reserved.