Генератор кривой Дракона на Python matplotlib
Написал код Кривой Дракона на 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()
Ответы (1 шт):
Автор решения: strawdog
→ Ссылка
Я бы на вашем месте сначала расчитал путь в системе Линденмайера, а потом уже переложил бы его в декартову систему. И уже после отрисовал бы всё целиком. например так:
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()

