Концентрические квадраты радуги - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу сделать это изображение, используя 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 голосов
/ 28 февраля 2019

В ожидании завершения решения @ darksky ;-) Я написал этот альтернативный пример, который использует штамповка вместо рисование для упрощения кода и ускорения графики:

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

0 голосов
/ 28 февраля 2019

Помимо отступов, здесь есть некоторые проблемы, которые указывают на то, что вы могли скопировать часть этого кода случайным образом откуда-то, не обращая пристального внимания на то, что он делает.Например, это для цикла:

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

содержит переменные w и h, но они не определены в вашем коде.Давайте сначала разберемся, как нарисовать квадрат.Черепаха должна сделать два шага:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...