使用Python Turtle重复函数

3
我希望了解如何循环函数以重新创建相同的形状/模式(谷歌照片标志),但旋转、位置和颜色等变量不同。以下是一段代码,它可以让我使用正确的角度之一来制作调色板,但比例不精确。而且,最好不要使用任何goto/home函数,因为我需要稍后重复这个绘图。我是否应该使用左/右方向而不是设置heading?
def photo():
    speed(1) # turtle speed (debugging)
    #speed(0)
    length = 50

    penup()
    color("#4688f4") #Blue petal
    begin_fill() 
    setheading(25)
    forward(length/5.5)
    setheading(0)
    forward(length)
    setheading(227)
    forward(length*0.87)
    setheading(135)
    forward(length*0.8)
    end_fill()

    color("#3d6ec9") #Blue petal
    begin_fill() 
    setheading(250)
    forward(length/5)
    setheading(270)
    forward(length/2.6)
    setheading(0)
    forward(length/1.6)
    end_fill() 

这里您可以看到来自代码的绘图...

thats the above described turtle drawing

更新:

enter image description here


那么...你只是在问循环长什么样子? - Flying Thunder
你需要将上述函数放入一个循环中,这将重复4次 - 每次循环后,您需要调整自己的位置。颜色变化可以从列表中作为参数传递给您的函数。在深入编码之前,请尝试考虑每次循环后您所处的位置以及开始下一次循环时必须去哪里! - Cut7er
我应该如何实现这个功能,使得花瓣旋转时,将这些角度作为变量,并添加90度,对于起始位置,只需将其移动到所需位置,然后基本上粘贴上面的内容即可。 - Bondspencil
1
将函数调用包装在循环中,并在函数定义末尾添加“turtle.tilt(angle)”以在每次绘制后旋转海龟。将角度替换为适当的值。 - Flying Thunder
1
@FlyingThunder,我不相信你的建议会奏效。tilt(angle)方法是用来倾斜海龟图像的,而不是改变它的方向或者正在绘制的图形的方向。使用right(90)更可能会达到想要的效果。 - cdlane
显示剩余5条评论
2个回答

3
非常简单的回答:
my_colors =['blue', 'yellow', 'red', 'green'] # replace with hex values

for i in range(4):

    photo(my_colors[i])
    right(90)

photo函数需要调整以接受一个关键字,可以像这样:def photo(my_color):,在函数中使用颜色时,只需调用color(my_color)

当然,在每个循环后,您需要考虑将要转向的位置以及是否需要向前移动。


3
您需要重新排列列表,因为在您想要重新创建的图像中,蓝色+黄色/红色+绿色不是相邻的。关键错误!!1 - Flying Thunder
刚刚随便选了4种颜色,但还是谢谢,关键错误已经避免了! - Cut7er
1
我会进一步研究它,但是我想到了一种快速而不太干净的方法,但不能像使用循环那样干净。我将进行更多测试! - Bondspencil
为什么蓝色花瓣上会有奇怪的间隙,而其他花瓣却没有?它们基本上具有相同的代码,但角度不同。https://i.stack.imgur.com/rOP8F.png - Bondspencil
不知道!可能是因为你使用了奇怪的数字计算,比如 length*0.87 - 这可能会导致由于四舍五入而产生错误。 - Cut7er

2
为什么蓝色花瓣上有奇怪的间隙,而其他花瓣没有?为了画出干净利落的图案,我们需要一些几何模型。我将使用一对底边长度为7个单位、角度为45度的直角三角形。

enter image description here

我在我认为是我们图形逻辑起点的位置上放了一个红点。为保持数学的一致性,我们将从上述图形中剪切出我们想要的图像。

enter image description here

我是否应该使用左/右来表示方向,而不是使用set heading?绘制这个图形并进行旋转的代码不能使用setheading(),因为它是绝对的,我们必须相对于我们的逻辑原点进行绘制。
from turtle import *

UNIT = 50

def photo(petal, shadow):

    right(45)  # move from "origin" to start of image
    forward(0.45 * UNIT)
    left(70)

    color(petal)

    begin_fill()
    forward(0.752 * UNIT)
    right(25)
    forward(6 * UNIT)
    right(135)
    forward(4.95 * UNIT)
    end_fill()

    right(45)

    color(shadow)

    begin_fill()
    forward(3.5 * UNIT)
    right(90)
    forward(2.5 * UNIT)
    right(25)
    forward(0.752 * UNIT)
    end_fill()

    left(70)  # return to "origin" where we started 
    forward(0.45 * UNIT)
    right(135)

penup()

for _ in range(4):
    photo("#4688f4", "#3d6ec9")
    left(90)

hideturtle()
mainloop()

enter image description here

我会把涂色的问题留给你处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接