Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Vẽ Barnsley Fern (Cây dương xỉ) trong Python với Matplotlib

Barnsley Fern là fractal hình thành bởi hệ lặp hàm (Iterated Function System - IFS) gồm 4 phép biến đổi affine với xác suất khác nhau. Được phát minh bởi Michael Barnsley.

Công thức toán học

Mỗi phép biến đổi: f(x,y) = [[a,b],[c,d]] * [x,y] + [e,f]

4 phép biến đổi với xác suất:

Xác suấtabcdef
1%0000.1600
85%0.850.04-0.040.8501.6
7%0.2-0.260.230.2201.6
7%-0.150.280.260.2400.44

Mã nguồn Python

import matplotlib.pyplot as plt
import random

x = [0]
y = [0]
current = 0

for i in range(1, 50000):  # tăng số lần lặp cho đẹp hơn
    z = random.randint(1, 100)

    if z == 1:  # 1%
        x.append(0)
        y.append(0.16 * y[current])
    elif 2 <= z <= 86:  # 85%
        x.append(0.85 * x[current] + 0.04 * y[current])
        y.append(-0.04 * x[current] + 0.85 * y[current] + 1.6)
    elif 87 <= z <= 93:  # 7%
        x.append(0.2 * x[current] - 0.26 * y[current])
        y.append(0.23 * x[current] + 0.22 * y[current] + 1.6)
    else:  # 94-100: 7%
        x.append(-0.15 * x[current] + 0.28 * y[current])
        y.append(0.26 * x[current] + 0.24 * y[current] + 0.44)

    current += 1

plt.figure(figsize=(8, 10))
plt.scatter(x, y, s=0.1, c='green', edgecolors='none')
plt.axis('off')
plt.title('Barnsley Fern')
plt.show()

Kết quả

Vẽ Barnsley Fern (Cây dương xỉ) trong Python với Matplotlib

Giải thích

  • Phép biến đổi 1 (1%): Tạo chân rừng (stem).
  • Phép biến đổi 2 (85%): Tạo các lá chính nhỏ dần lên trên.
  • Phép biến đổi 3 & 4 (7% mỗi): Tạo lá trái/phải dưới cùng.
  • Số điểm 50,000 cho hình ảnh mượt; 1000 chỉ cho hình thô.

Mở rộng

  • Thay đổi tham số để tạo fractal khác (Maple leaf, Spiral...).
  • Dùng NumPy vectorization để tăng tốc độ lớn.
  • Lưu thành ảnh high-res: plt.savefig('fern.png', dpi=300).

Kết luận

Barnsley Fern minh họa đẹp cho Chaos Theory và IFS. Chỉ cần vài chục dòng Python tạo ra hình ảnh tự nhiên phức tạp.