Рисование концентрических квадратов

Проходя книгу "Как думать, как...", я застрял с упражнением 4.9.2.

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

Следующий код показывает, как далеко я дошел до сих пор:

import turtle
wn = turtle.Screen()
wn.bgcolor("lightgreen")
tess = turtle.Turtle()

def draw_square(t,size):
    for i in range(4):
        tess.forward(size)
        tess.left(90)

size = 20
for j in range(3):
   tess.pensize(3)
   draw_square(tess,size)
   size = size + 20
   tess.penup()
   tess.goto(-20, -20)
   tess.pendown()

wn.mainloop()

Может ли кто-нибудь быть таким добрым и показать мне правильное направление, пожалуйста?

Спасибо!

Свен

6 ответов

Решение

Проблема здесь:

tess.goto(-20, -20)

У вас есть две проблемы. Во-первых, если каждый квадрат на 20 единиц больше и вы смещаете каждый квадрат на (-20, -20) все квадраты будут разделять один угол. Вместо этого вы хотите сместить угол квадрата на (-10, -10) так что внутренний квадрат смещен на 10 единиц со всех сторон.

Вторая проблема заключается в том, что .goto(x, y) устанавливает абсолютную позицию, а не смещение. Чтобы перейти к смещению, необходимо рассчитать новую абсолютную позицию на основе смещения:

tess.goto(tess.xcor()-10, tess.ycor()-10)

Или же

tess.goto(tess.pos() + (-10, -10))
import turtle
def draw_sqr(name,size):
    for i in range(4):
        name.forward(size)
        name.left(90)
    name.penup()
    name.backward(10)
    name.right(90)
    name.forward(10)
    name.left(90)
    name.pendown()

window = turtle.Screen()
window.bgcolor('lightgreen')
window.title("conc_sqr")

x = turtle.Turtle()
x.color('hotpink')
x.pensize(3)

for i in range(5):
    draw_sqr(x,20 + 20*i)

window.mainloop()
import turtle
def drawSquare (t, size):
    for i in range (4):
        t.forward(size)
        t.left(90)

def main():
    wn = turtle.Screen()
    wn.bgcolor('black')
    pat = turtle.Turtle()
    pat.pensize(2)
    pat.speed(10)
    pat.color('blue')
    space = -10

    for i in range(20, 105, 20):
        drawSquare(pat,i)
        pat.up()
        pat.goto(space, space)
        pat.down()
        space = space - 10
    wn.exitonclick()
main()
def draw_rectangle(animal, width, height): 

    for _ in range(2):
        animal.forward(width)
        animal.left(90)
        animal.forward(height)
        animal.left(90)

def draw_square(animal, size): 
    draw_rectangle(animal, size, size)

def make_window(back_color,title):

    window = turtle.Screen()
    window.bgcolor(back_color)
    window.title(title)
    return window

def make_turtle(color, size):

    animal = turtle.Turtle()
    animal.color(color)
    animal.pensize(size)
    return animal

import turtle
window = make_window("lightgreen","Squares")
tess = make_turtle("hotpink",3)

size_sqr=20
adjustment = 10
for _ in range(5):
    draw_square(tess,size_sqr)
    size_sqr += 20
    tess.penup()
    tess.backward(20/2)
    tess.right(90)
    tess.forward(20/2)
    tess.left(90)
    tess.pendown()

Иногда, когда вы застряли, хороший подход к графике черепахи - это думать вне площади. Если мы рассматриваем желаемый результат как плохо нарисованные концентрические круги, то проблема сводится к:

from turtle import Turtle, Screen

HYPOTENUSE = (2 ** 0.5) / 2

screen = Screen()
screen.bgcolor("lightgreen")

tess = Turtle()
tess.pencolor("red")
tess.setheading(45)
tess.width(3)

for radius in range(20, 20 * 5 + 1, 20):
    tess.penup()
    tess.goto(radius/2, -radius/2)
    tess.pendown()
    tess.circle(radius * HYPOTENUSE, steps=4)

screen.exitonclick()

ВЫХОД

          import turtle 

    def drawsquare(t,sz): #(turtle, size)
        for i in range(4):
            t.fd(sz)
            t.right(90)
        
    def main():
        wn = turtle.Screen()
        your_turtle = turtle.Turtle()
        your_turtle.pensize(3)
        wn.bgcolor("light green")
        your_turtle.pencolor("hot pink")
        
        for i in range(1,6):
            drawsquare(your_turtle,20*i)
            your_turtle.up()
            your_turtle.left(135)
            your_turtle.fd(14.142) #the distance between each square
            your_turtle.right(135)
            your_turtle.down()
        
    main()
    wn.exitonclick()
Другие вопросы по тегам