更新 Fibo.py

This commit is contained in:
joy 2025-02-23 01:54:33 +09:00
parent 5e4c39b3ad
commit cd1b1748d4

68
Fibo.py
View File

@ -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)