2016-12-12 2 views
-1

При просмотре книги «Как думать, как ...», я застрял в упражнении 4.9.2.Рисунок концентрических квадратов

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

enter image description here

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

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() 

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

Спасибо!

Свен

+0

Ого, этот образ заставляет меня головокружение ... – mattmilten

+2

Похоже, что вы 'просто не хватает того, что вам нужно начинать в другом месте для каждого квадрата. – Barmar

+0

Какой результат вы получаете? –

ответ

1

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

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)) 
0

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

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() 

ВЫХОДА

enter image description here

Смежные вопросы