Генератор кривой Дракона на Python matplotlib

Рейтинг: 0Ответов: 1Опубликовано: 15.02.2023

Написал код Кривой Дракона на Python по гайдам, но не могу понять что нужно поменять, чтобы получить другой, более красивый рисунок, как в интернете. После выполнения результат такой: введите сюда описание изображения

А хочется такой: введите сюда описание изображения

Код:

import matplotlib.pyplot as plt
import math


def dragon_curve(order, scale=10):
    if order == 0:
        return [(0, 0)]
    else:
        curve = dragon_curve(order - 1, scale)
        new_curve = [(x, y) for x, y in curve]
        new_curve.append((curve[-1][0] + scale * math.cos(math.pi / 4),
                          curve[-1][1] + scale * math.sin(math.pi / 4)))
        new_curve += [(x + scale * math.cos(math.pi / 4), y - scale * math.sin(math.pi / 4))
                      for x, y in reversed(curve)]
        return new_curve


def plot_dragon_curve(order, scale=10):
    curve = dragon_curve(order, scale)
    x, y = zip(*curve)
    plt.plot(x, y)
    plt.axis('equal')
    plt.xlabel('X')
    plt.ylabel('Y')


order = 12
scale = 0.01
plot_dragon_curve(order, scale)
plt.show()

Ответы

▲ 2

Я бы на вашем месте сначала расчитал путь в системе Линденмайера, а потом уже переложил бы его в декартову систему. И уже после отрисовал бы всё целиком. например так:

import math
import matplotlib.pyplot as plt

SCALE = 10
DEPTH = 12
def complement(path: str) -> str:
    position = int(len(path)//2)
    path = path[:position]+ str(abs(int(path[int(len(path)//2)])-1)) + path[position+1:]
    return path


def generate_dragon(scale, depth):
    path = "1"
    i = 1
    while i <= depth:
        path = path + "1" + complement(path)
        i+=1
    points = [(0,0)]
    angle = 0
    for p in path:
        if p =="1":
            angle = angle + math.pi/2
        else:
            angle = angle - math.pi/2
        x = points[-1][0]-scale * math.cos(angle)
        y = points[-1][1]-scale * math.sin(angle)
        points.append((x,y))
    return points
    

points = generate_dragon(SCALE, DEPTH)
X = [j[0] for j in points]
Y = [j[1] for j in points]
fig, ax = plt.subplots(figsize=(10,10))

plt.plot(X, Y)
ax.set_aspect('equal', adjustable='box')
plt.show()

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