Hyperboli c Spirals (первое обучение с Think Python) - PullRequest
0 голосов
/ 01 мая 2020

Я учу Python (ради интереса) через книгу Думай Python. Пока я действительно наслаждаюсь этим новым хобби. Одним из недавних упражнений было создание спирали Архимеда. Чтобы проверить свои навыки, я работал над созданием спирали гиперболи c, но был в тупике!

в соответствии с уравнением r = a + b * theta ^ (1 / c)

  • , когда c = 1 , мы видим спираль Архимеда
  • , когда c = -1 мы должны увидеть гиперболи c спираль

Я использую следующий код и буду признателен за любую помощь в правильном направлении.

  • Дополнительные баллы для тех, кто может помочь мне в правильном направлении, не давая напрямую ответ. Если это не просто проблема форматирования.
  • Нет баллов, если предложенный ответ предполагает использование (x, y) координат для рисования.
import turtle
import math

def draw_spiral(t, n, length=3, a=0.1, b=0.0002):
    """Draws an Archimedian spiral starting at the origin.

    Args:
      n: how many line segments to draw
      length: how long each segment is
      a: how loose the initial spiral starts out (larger is looser)
      b: how loosly coiled the spiral is (larger is looser)

    http://en.wikipedia.org/wiki/Spiral
    """
    theta = 0.1

    for i in range(n):
        t.fd(length)
        dtheta = 1/((a + b * (theta**(1/-1))))

        t.lt(dtheta)
        theta += dtheta

# create the world and bob
bob = turtle.Turtle()
draw_spiral(bob, n=1000)

turtle.mainloop()

"""Source code from ThinkPython @ http://greenteapress.com/thinkpython2/code/spiral.py

edited to attempt a hyperbolic spiral"""

большое спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Простая настройка констант, переданных в draw_spiral() в качестве аргументов:

def draw_spiral(t, n, length=1, a=0.01, b=60):

Мне удалось создать спираль вдоль описанных вами линий:

enter image description here

Однако, это др aws из снаружи в , а не изнутри . Так что, может быть, не то, что вы ищете.

0 голосов
/ 01 мая 2020

Как уже упоминалось в ответе @cdlane, это всего лишь вопрос аргументов. Я расширю ответ.

Для Архимедовой спирали добавьте аргумент c к функции draw_spiral:

def draw_spiral(t, n, length=3, a=0.1, b=0.0002, c=-1):

    theta = 0.1
    for i in range(n):
        t.fd(length)
        dtheta = 1/((a + b * (theta**(1/c))))

        t.lt(dtheta)
        theta += dtheta 

И используйте следующие аргументы например:

draw_spiral(bob, n=1000, length=1, a=0.01, b=0.001, c=1)

...