Кривая Гильберта с использованием черепашьей графики и рекурсии - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь реализовать сгенерированную L-System кривую Гильберта, используя графику и рекурсию python turtle. Мой код, кажется, работает для первых двух уровней рекурсии n = 1 и n = 2, но кроме этого, графика просто запуталась (хотя я могу наблюдать в них дополнительные модули), и я не могу понять что может быть не так, нужны ли мне промежуточные шаги для регенерации модулей Гильберта для более глубоких уровней рекурсии? Пожалуйста, смотрите мой код ниже, это относительно просто:

import turtle

def Hilbert_curve(A,rule,t,n):

    if n>=1:
        if rule:
            t.left(90)
            Hilbert_curve(A,not rule,t, n-1)
            t.forward(A)
            t.right(90)
            Hilbert_curve(A, rule,t, n-1)
            t.forward(A)
            Hilbert_curve(A,rule,t, n-1)
            t.right(90)
            t.forward(A)
            Hilbert_curve(A,not rule,t, n-1)
            t.left(90)
        else:
            t.right(90)
            Hilbert_curve(A,rule,t, n-1)
            t.forward(A)
            t.left(90)
            Hilbert_curve(A,not rule,t, n-1)
            t.forward(A)
            Hilbert_curve(A,not rule,t, n-1)
            t.left(90)
            t.forward(A)
            Hilbert_curve(A, rule,t, n-1)
            t.right(90)

def main():
    A=10
    t=turtle.Turtle()
    my_win=turtle.Screen()
    n=2
    rule=True
    Hilbert_curve(A,rule,t,n)
    my_win.exitonclick()

main()

Гильберт n = 2

Гильберта n = 3

1 Ответ

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

Проблема с вашим предложением else. rule уже инвертирован, входя в функцию, поэтому вам нужно трактовать rule так же, как предложение затем :

    else:
        t.right(90)
        Hilbert_curve(A, not rule, t, n - 1)
        t.forward(A)
        t.left(90)
        Hilbert_curve(A, rule, t, n - 1)
        t.forward(A)
        Hilbert_curve(A, rule, t, n - 1)
        t.left(90)
        t.forward(A)
        Hilbert_curve(A, not rule, t, n - 1)
        t.right(90)

Однако, если мы изменим rule с логического значения на число, parity, это либо 1, либо -1, а затем умножим parity на угол, мы можем исключить одно из двух предложений оригинального if заявление:

from turtle import Screen, Turtle

def hilbert_curve(turtle, A, parity, n):

    if n < 1:
        return

    turtle.left(parity * 90)
    hilbert_curve(turtle, A, - parity, n - 1)
    turtle.forward(A)
    turtle.right(parity * 90)
    hilbert_curve(turtle, A, parity, n - 1)
    turtle.forward(A)
    hilbert_curve(turtle, A, parity, n - 1)
    turtle.right(parity * 90)
    turtle.forward(A)
    hilbert_curve(turtle, A, - parity, n - 1)
    turtle.left(parity * 90)

screen = Screen()

yertle = Turtle()
yertle.speed('fastest')  # because I have no patience

hilbert_curve(yertle, 10, 1, 4)

screen.exitonclick()

enter image description here

...