ThinkPython - Ex 4.5 - Напишите программу, которая рисует спираль Архимеда (или один из других видов) - PullRequest
0 голосов
/ 09 ноября 2018

Это только у меня или у всех, кто сталкивается с множеством проблем при попытке ответить на этот вопрос из упражнения Think Python.Я пытаюсь выполнить упражнения из четвертой главы, но сталкиваюсь с множеством проблем.Упражнение 4.5 говорит: «Напишите программу, которая рисует спираль Архимеда».У меня есть этот код, но он не работает в Python.Мне нужно простое возможное решение для этого.Пожалуйста, помогите.

from TurtleWorld import *

world = TurtleWorld()
bob = Turtle()

def polygon(t, length, n):
    t = Turtle()
    for i in range(n):
        fd(t, length)
        lt(t, 300 / n)

polygon(bob, 5, 8)

1 Ответ

0 голосов
/ 10 ноября 2018

[В следующем обсуждении я использую библиотеку черепах, которая поставляется с Python, а не TurtleWorld, поэтому настройте ее соответствующим образом.] Из онлайнового документа ThinkPython PDF:

Упражнение 4.5. Читайте о спиралях в http://en.wikipedia.org/wiki/Spiral; затем напишите программу, которая рисует архимедову [sic] спираль (или одну других видов). Решение: http://thinkpython.com/code/spiral.py

Если мы перейдем по ссылке Википедии от Спираль до Архимедова спираль , мы получим формулу r = a + b * theta, которая, естественно, хочет быть вычислена в полярных координатах и ​​построена в декартовой системе координат. координаты:

def spiral(turtle, rotations=6, a=0.0, b=5):
    theta = 0.0

    while theta < rotations * 2 * pi:
        radius = a + b * theta
        x, y = radius * cos(theta), radius * sin(theta)
        turtle.goto(x, y)
        theta += 0.1

Где a контролирует начальный угол спирали, а b контролирует расстояние между витками :

enter image description here

Но решение, которое предлагает ThinkPython, отличается:

Чтобы избавиться от pi, sin() и cos() от math.py, он изображает черепаху на спирали и то, как выглядит каждое движение по этой спирали. Он вводит n, который представляет количество отрезков линии, и length длину этих сегментов. Переменная b по-прежнему означает примерно то же самое, хотя и в другом масштабе, а a представляет, насколько плотно начинается начальная спираль. Опять же, мы начинаем с:

theta = 0.0

Но вместо того, чтобы зацикливаться на количестве полных вращений, мы зацикливаемся до n, количества сегментов для рисования. Так что n должно быть большим, например 1000 вместо 5 в вашем коде. На каждой итерации мы перемещаемся вперед length пикселей, а затем вычисляем новый угол дельта для поворота на основе a, b и theta:

delta = 1 / (a + b * theta)

Мы поворачиваемся на эту небольшую сумму, а также добавляем эту сумму к theta непосредственно перед повторным циклом. В этом подходе a и b обычно меньше 1, но ненулевые:

enter image description here

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

...