同心彩虹方块

时间:2019-02-27 23:53:01

标签: python colors turtle-graphics

我想使用turtle制作这张图片,

Picture of result

这是我到目前为止的内容,但是有多个错误。

import turtle
import colorsys
import random

def draw_circle(x,y,r,color):
    turtle.up()
    turtle.seth(0)
    turtle.goto(x,y-r)
    turtle.down()
    turtle.fillcolor(color)
    turtle.begin_fill()
    turtle.circle(r)
    turtle.end_fill()

def draw_square(x,y):
    turtle.up()
    turtle.seth(0)
    turtle.goto(x,y)
    turtle.fillcolor(color)
    turtle.pencolor(color)
    turtle.down()
    turtle.begin_fill()

    for i in range(2):
        turtle.fd(w)
        turtle.left(90)
        turtle.fd(h)
        turtle.left(90)

    turtle.end_fill()


turtle.speed(0)

x = 0
y = -200

for i in range(100):
    color = colorsys.hsv_to_rgb(x,1,1)
    turtle.pencolor(color)
    draw_square(x,y)
    x += .01
    y += 10

我收到此错误:

Traceback (most recent call last):
  File "/Users/MBach/Documents/concentric squares.py", line 39, in <module>
    draw_square(x,y)
  File "/Users/MBach/Documents/concentric squares.py", line 24, in draw_square
    turtle.fd(w)
NameError: name 'w' is not defined
>>> 

2 个答案:

答案 0 :(得分:1)

在等待@darksky解决方案完成时;-)我写了这个替代示例,它使用 stamping 而不是 drawing 来简化代码并加快图形处理: / p>

import turtle
import colorsys

STEP = 2  # distance between squares
WIDTH = 375  # width of the biggest square

CURSOR_SIZE = 20

def draw_square(width, color):
    turtle.shapesize(width / CURSOR_SIZE)
    turtle.pencolor(color)
    turtle.stamp()

turtle.shape('square')
turtle.fillcolor('white')

hue = 0

for width in range(WIDTH, 0, -2 * STEP):
    color = colorsys.hsv_to_rgb(hue, 1, 1)
    draw_square(width, color)
    hue += 0.01

turtle.done()

盖章并不是解决所有乌龟问题的方法,而是像这样的简单几何图形,它具有以下优点:

enter image description here

答案 1 :(得分:0)

除了缩进,这里还存在一些问题,表明您可能已经从某个地方随机粘贴了部分代码,而没有密切注意它的作用。例如,此for循环:

for i in range(2):
    turtle.fd(w)
    turtle.left(90)
    turtle.fd(h)
    turtle.left(90)

包含变量wh,但是这些变量未在您的代码中定义。首先让我们了解如何绘制正方形。乌龟必须执行两个步骤:

  1. 转到给定坐标(x,y)
  2. 进行四个90度旋转,绘制出正方形的形状。

要在不绘制任何内容的情况下到达坐标,我们必须用turtle.penup()抬起笔,用turtle.goto()到那里,用turtle.pendown()放下笔。因此,您的draw_square应该看起来像这样:

def draw_square(x, y, width):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.forward(width)
    turtle.right(90)
    turtle.forward(width)
    turtle.right(90)
    turtle.forward(width)
    turtle.right(90)
    turtle.forward(width)
    turtle.right(90)

接下来,让我们看看您编写的第二个for循环:

x = 0
y = -200

for i in range(100):
  color = colorsys.hsv_to_rgb(x, 1, 1)
  turtle.pencolor(color)
  draw_square(x, y)
  x += .01
  y += 10

您的想法有些正确。从x,y坐标开始,在每次迭代中更新它,更新颜色并绘制一个正方形。但是,有几个问题。首先,虽然x必须增加,但y实际上必须减少。这是因为当您从屏幕顶部移至底部时,y值会减小。其次,因为正方形是同心的,所以它们必须改变的数量必须相等。

让我们定义一个step,即正方形之间的距离width,正方形的大小,初始位置,我们必须确保hue的增长速度比x和y。

step = 3 # distance between squares
width = 600 #width of the biggest square
x, y = -width / 2,  width / 2 
hue = 0

for i in range(100):
    color = colorsys.hsv_to_rgb(hue, 1, 1)
    turtle.pencolor(color)
    draw_square(x, y, width)
    x += step
    y -= step
    width -= 2 * step
    hue += 0.01