Построение кривой Мура в Python - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь построить кривую Мура (https://en.wikipedia.org/wiki/Moore_curve) в python. Я дошел до построения кривой Хилберта, так как кажется, что есть больше ресурсов по Хиллберту и Муру, но мне не ясно, как редактировать последующие итерации кривой, чтобы она правильно строила кривую Мура.

Это код python для кривой Хиллберта:

def d2xy(n,d):
    t=d
    x=y=0
    s=1
    while s<n:
        rx=1&(t/2)
        ry=1&(t^rx)
        s,x,y,rx,ry=rot(s,x,y,rx,ry)
        x+=s*rx
        y+=s*ry
        t/=4
        s*=2
    return x,y

def rot(n,x,y,rx,ry):
    if ry==0:
        if rx==1:
            x=n-1-x
            y=n-1-y
        x,y=y,x

    return n,x,y,rx,ry

Как я могу изменить это, чтобы построить кривую Мура?

1 Ответ

0 голосов
/ 07 августа 2020

На странице Википедии, которую вы цитируете, разъясняется, как это сделать, используя графику черепахи и L-систему. Просто следуя этим инструкциям, я получил:

from turtle import Screen, Turtle

AXIOM = 'LFL+F+LFL'

RULES = {
    'L': '-RF+LFL+FR-',
    'R': '+LF-RFR-FL+',
}

DISTANCE = 300
CYCLES = 4

def draw(string, distance):
    for character in string:
        if character == 'F':
            turtle.forward(distance)
        elif character == '+':
            turtle.right(90)
        elif character == '-':
            turtle.left(90)
        else:
            pass  # ignore other characters

def produce(string):
    production = ''

    for character in string:
        if character in RULES:
            production += RULES[character]
        else:
            production += character  # just copy other characters

    return production

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.setheading(90)

string = AXIOM

for _ in range(1, CYCLES):
    string = produce(string)

distance = DISTANCE / CYCLES ** 2  # crude estimate, fix this

draw(string, distance)

screen.tracer(True)
screen.exitonclick()

enter image description here

And the fun part is, having implemented our L-system, by just changing the data, not the code, we can also make the Hilbert curve:

from turtle import Screen, Turtle

AXIOM = 'A'

RULES = {
    'A': '-BF+AFA+FB-',
    'B': '+AF-BFB-FA+',
}

DISTANCE = 300
CYCLES = 6

# ...

введите описание изображения здесь

Конечно, вычисление переменной distance требует некоторой работы ...

...