【问题标题】:Repeating functions with python turtle用 python turtle 重复函数
【发布时间】:2018-08-30 12:52:49
【问题描述】:

我想知道如何制作函数循环以重新创建具有不同旋转和位置以及不同变量(例如颜色)的相同形状/图案(google photo logo)。下面是允许我制作具有正确角度但比例不准确的托盘之一的代码。也不想使用任何 goto/home 功能,因为我需要稍后重复此绘图。我应该使用左/右作为方向而不是设置航向吗?

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() 

这里你从代码中看到了绘图...

更新:

【问题讨论】:

  • 所以....你只是在问一个循环是什么样子的?
  • 您需要将上述函数放入一个循环中,循环执行 4 次 - 每次循环后,您需要调整您的位置。可以将颜色更改作为列表中的参数提供给您的函数。在你深入编码之前,试着想想你在每个循环之后到达哪里以及你必须去哪里才能开始下一个循环!
  • 当花瓣旋转时我应该如何实现这一点,将这些角度设为变量并添加 90 度,对于起始位置只需将其移动到所需位置并基本上粘贴上面的内容?
  • 将函数调用包装在一个循环中,并在函数定义的末尾添加turtle.tilt(angle),以在每次绘制后旋转海龟。用适当的值替换角度
  • @FlyingThunder,我不相信你的建议会奏效。 tilt(angle) 倾斜乌龟图像,而不是它的方向,而不是它正在绘制的东西。 right(90) 可能会更好。

标签: python turtle-graphics


【解决方案1】:

非常简单的答案:

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)

但当然,您需要考虑在每次循环后您将转向哪里以及是否还需要继续前进。

【讨论】:

  • 您需要重新排列列表,因为在图片中您要重新创建的蓝色+黄色/红色+绿色不相邻。严重错误!!1
  • :-D 刚刚选择了 4 种随机颜色,但谢谢,躲过了严重错误!
  • 我会更多地研究它,但我认为这是一种快速而肮脏的方法,但不会像使用循环那样干净。我会做更多的测试!
  • 为什么蓝色花瓣上有奇怪的缝隙,而其他的却没有?它们基本上具有相同的代码,但角度不同。 i.stack.imgur.com/rOP8F.png
  • 不知道!可能是因为您使用像 length*0.87 这样的奇怪数字进行计算 - 这可能是由于四舍五入而导致错误的原因
【解决方案2】:

为什么蓝色花瓣上有奇怪的缝隙,而其他的却没有?

为了清晰地绘制这个,我们需要某种几何模型。我将使用一对匹配的直角三角形,底边为 7 个单位,角为 45 度:

我在我认为我们绘图的逻辑原点处添加了一个红点。为了保持数学一致,我们将从上图中剪切出我们想要的图像:

我应该使用左/右作为方向而不是设置航向吗?

绘制这个图形并旋转它的代码不能使用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()

我会把着色问题留给你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多