diff --git a/Fibo.py b/Fibo.py index 67e6d0d..649c2d5 100644 --- a/Fibo.py +++ b/Fibo.py @@ -1,50 +1,36 @@ import numpy as np import matplotlib.pyplot as plt -def fibonacci_spiral(N=10): - """ 繪製費波那契螺旋圖 """ +def fibonacci_spiral(n): + """繪製費波那契螺旋""" + golden_ratio = (1 + np.sqrt(5)) / 2 + theta = np.linspace(0, n * np.pi / 2, 1000) + r = golden_ratio ** (theta / (np.pi / 2)) - # 計算前 N 個費波那契數 - F = [1, 1] - for i in range(2, N): - F.append(F[i-1] + F[i-2]) - - # 設定方向向量 (右、上、左、下) - directions = [(1, 0), (0, 1), (-1, 0), (0, -1)] + x = r * np.cos(theta) + y = r * np.sin(theta) - pos = np.array([0, 0]) # 初始位置 - theta = np.linspace(0, np.pi/2, 20) # 角度範圍 (畫四分之一圓) + plt.figure(figsize=(8, 8)) + plt.plot(x, y, color='gold', linewidth=2) - fig, ax = plt.subplots(figsize=(8, 8)) - ax.set_aspect('equal') + # 增加方格來顯示費波那契數列 + a, b = 1, 1 + x, y = 0, 0 + angle = 0 + for _ in range(n): + plt.gca().add_patch(plt.Rectangle((x, y), a, a, fill=False, edgecolor='blue', linewidth=1.5)) + x_new = x + a * np.cos(angle) + y_new = y + a * np.sin(angle) + a, b = b, a + b + angle -= np.pi / 2 + x, y = x_new, y_new - # 繪製正方形與四分之一圓 - for i in range(N): - dir_idx = i % 4 - dir_vec = np.array(directions[dir_idx]) # 取得方向向量 - size = F[i] - - # 畫正方形 - square = plt.Rectangle(pos, size, size, fill=False, edgecolor='black', linewidth=1.5) - ax.add_patch(square) - - # 計算四分之一圓的中心點 - center = pos + dir_vec * size - - # 畫四分之一圓弧 - arc_x = center[0] + size * np.cos(theta + dir_idx * np.pi / 2) - arc_y = center[1] + size * np.sin(theta + dir_idx * np.pi / 2) - ax.plot(arc_x, arc_y, 'b', linewidth=2) - - # 更新下一個正方形的位置 - pos = pos + dir_vec * size - - # 設定圖表範圍 - ax.set_xlim(-F[-2], sum(F)) - ax.set_ylim(-F[-2], sum(F)) - plt.axis('off') # 隱藏軸 - plt.title("Fibonacci Spiral") + plt.xlim([-b, b]) + plt.ylim([-b, b]) + plt.axis('equal') + plt.axis('off') + plt.title("Fibonacci Spiral", fontsize=14) plt.show() -# 執行函數來繪製圖形 -fibonacci_spiral(N=10) +# 繪製前10個費波那契數的螺旋 +fibonacci_spiral(10) \ No newline at end of file