Раздел 4.3 Упражнение № 5 - «Подумай над питоном» Аллена Дауни - PullRequest
0 голосов
/ 11 октября 2018

Ссылка на Упражнения доступна здесь - Пример: Разработка интерфейса, Раздел 4.3 упражнения

Процитируя вопрос, похоже, мне нужно реализовать функцию arc():

Создайте более общую версию circle под названием arc, которая принимает дополнительный параметр angle, который определяет, какую долю круга нарисовать.angle в единицах градусов, поэтому, когда угол = 360, arc должен нарисовать полный круг.

Код, который я написал до сих пор:

import turtle
import math
bob = turtle.Turtle()

def polygon(t, n, length):
    for i in range(n):
        t.fd(length)
        t.lt(360/n)

def circle(t, r):
    circumference = 2 * math.pi * r
    n = int(circumference/3) + 1
    length = circumference/n
    polygon(t, n, length)

def arc(t, r, angle):
    arc_length = 2 * math.pi * r * (angle/360)
    n = (arc_length/4) + 1

arc(bob, 1000, 45)

turtle.mainloop()

Я собираюсь вызвать функцию circle() в arc(), так же как polygon() вызывался вcircle(), но я не понимаю, как мне это сделать.Кроме того, функция arc() не ничего рисует, а просто показывает мне неподвижную Черепаху.

Я считаю, что объект Черепаха bob не получает ни одного изинструкции по перемещению, назначенные в пределах polygon().Таким образом, все, что он делает, это отображает объект «Черепаха»!

Я могу ошибаться, и здесь мне нужно разъяснение.Должен ли я позвонить circle() в пределах arc(), а также заставить объект Черепаха двигаться?Есть ли более простые альтернативы?Вызов функций внутри функции все еще сбивает меня с толку, поэтому было бы неплохо узнать больше о них!

Ответы [ 2 ]

0 голосов
/ 29 июля 2019
import turtle
bob=turtle.Turtle()
import math
def arc(t,radius,angle):
    circumference = 2.0*math.pi*radius
    frac = angle/360.0
    arclength = circumference*frac
    n = 50 # pick a number
    len = arclength/n;
    turnang = angle/n
    for i in range(n):
        t.fd(len)
        t.lt(turnang)
arc(bob, 130,360)
turtle.done()
0 голосов
/ 11 октября 2018

Я пытаюсь ... вызвать функцию circle () внутри arc () так же, как polygon () был вызван в circle ()

Вы получили это задом наперед,Задача гласит:

Сделайте более общую версию круга с именем arc

Так же, как вы могли бы нарисовать круг с более общей функцией polygon(), вы должны бытьвозможность нарисовать круг с более общей функцией arc().Вот скелетная программа для размышления об этом:

from turtle import Screen, Turtle
from math import pi

def polygon(turtle, sides, length):
    outside_angle = 360 / sides

    for _ in range(sides):
        turtle.forward(length)
        turtle.left(outside_angle)

def circle_using_polygon(turtle, radius):
    circumference = 2 * pi * radius
    sides = min(60, int(circumference / 3))
    length = circumference / sides
    polygon(turtle, sides, length)

def arc(turtle, radius, angle):
    # implement arc not by calling *circle() nor by
    # calling polygon() but rather by borrowing code
    # from both and adding one more step to reduce
    # the number of sides based on the arc angle

def circle_using_arc(turtle, radius):
    arc(turtle, radius, 360)

bob = Turtle(visible=False)

# Draw overlapping circles three different ways:

bob.color("green")
circle_using_polygon(bob, 100)

for color in ['cyan', 'magenta', 'yellow', 'black']:
    bob.color(color)
    arc(bob, 100, 90)

bob.color("blue")
circle_using_arc(bob, 100)

screen = Screen()

screen.mainloop()
...