Рисование концентрических квадратов
Проходя книгу "Как думать, как...", я застрял с упражнением 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()