Рекурсивные радужные круги вокруг друг друга - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь изменить цвет и количество кружков, отображаемых на экране. До сих пор я выяснил, как сделать их все разными цветами в рекурсивном шаблоне, но мне нужна помощь, чтобы узнать, как добавить больше. Прилагается то, что я имею против того, что мне нужно достичь.

мой код

import turtle
import colorsys

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

def draw_recursive_circles(x,y,r,color,n):
    if n == 0:
        return
    draw_circle(x,y,r,color)
    colors = ['red','orange','yellow','green','blue','purple']
    i = 0
    for angle in range(30,360,60):
        turtle.up()
        turtle.goto(x,y)
        turtle.seth(angle)
        turtle.fd(r*2)
        draw_recursive_circles(turtle.xcor(),turtle.ycor(),r/3,colors[i],n-1)
        i += 1

turtle.tracer(0)
turtle.hideturtle()
turtle.speed(0)
draw_recursive_circles(0,0,100,'red',5)
turtle.update()

Чего мне нужно достичь

Что у меня до сих пор

1 Ответ

1 голос
/ 23 марта 2019

Вы import colorsys, но никогда не используете его - это ключ к тому, что вы должны генерировать цвета на основе углов, а не - фиксированный список цветов.Причина импорта заключается в том, что цвета черепахи RGB - это не та модель, которая подходит для наших нужд, поэтому нам нужна более подходящая модель, такая как HSV (где мы действительно заботимся только о H / hue), и пусть он преобразует эти значения в RGB .

Количество спутников определяется вашим вызовом range:

for angle in range(30,360,60):

Что для этого чертежа должно быть больше похоже на:

for angle in range(0, 360, 30):

Поскольку существует двенадцать спутников, а 360 / 30 равно 12. Наконец, нам необходимо вести надлежащий учет таким образом, чтобы при каждом изменении позиции или курсаЧтобы сделать рекурсивное рисование, нам нужно восстановить исходные значения при выходе.Ниже приведен упрощенный пример решения этой проблемы:

from turtle import Screen, Turtle
from colorsys import hsv_to_rgb

def draw_circle(radius):
    y = turtle.ycor()  # save position & heading
    heading = turtle.heading()

    turtle.fillcolor(hsv_to_rgb(heading / 360, 1.0, 1.0))

    turtle.sety(y - radius)
    turtle.setheading(0)

    turtle.begin_fill()
    turtle.circle(radius)
    turtle.end_fill()

    turtle.sety(y)  # restore position & heading
    turtle.setheading(heading)

def draw_recursive_circles(radius, n):
    if n == 0:
        return

    draw_circle(radius)

    if n > 1:
        heading = turtle.heading()  # save heading

        for angle in range(0, 360, 30):
            turtle.setheading(angle)
            turtle.forward(radius * 2)

            draw_recursive_circles(radius / 5, n - 1)

            turtle.backward(radius * 2)

        turtle.setheading(heading)  # restore heading

screen = Screen()
screen.tracer(False)

turtle = Turtle(visible=False)
turtle.penup()

draw_recursive_circles(150, 4)

screen.update()
screen.tracer(True)
screen.exitonclick()

enter image description here

Я намеренно держал перо, чтобы упростить мой пример, чтобы только заполненные частииз кругов показаны.Вернув окружающие контуры, я оставляю вам упражнение.

Центральный круг не того цвета.Исправить это просто, установив курс черепахи до первоначального вызова draw_recursive_circles()

...