本文代碼部分實現參考自CSDN博客:https://blog.csdn.net/ak_bingbing/article/details/135852038
一、引言
Matplotlib作為Python生態中最著名的可視化庫,其三維繪圖功能可以創造出令人驚嘆的數學藝術。本文將通過一個獨特的參數方程,結合極坐標系轉換與動畫技術,演示如何用代碼"栽培"一朵永恒旋轉的立體永生花。該作品展現了數學之美與編程創意的完美結合。
二、實現原理
2.1 參數方程設計
永生花的形態由以下核心方程構建:
- 時間維度:
t
從-4π到26π漸變,形成螺旋生長軌跡 - 衰減函數:
p = (π/2)*exp(-t/(8π))
控制花瓣的展開程度 - 振蕩函數:
change = sin(20t)/50
添加自然卷曲效果 - 形態函數:
u = 1 - (1 - mod(3.3t, 2π)/π)^4/2 + change
生成花瓣的波浪邊緣
2.2 坐標變換
通過極坐標轉換實現三維曲面:
x = linspace(0, 1, res_x) # 徑向采樣
t = linspace(-4π, 26π, res_t) # 角度采樣
r = 1.5*u*(x*sin(p)+y*cos(p)) # 極徑計算
h = u*(x*cos(p)-y*sin(p)) # 高度計算
X, Y = r*cos(t), r*sin(t) # 轉換為笛卡爾坐標
三、代碼實現
3.1 曲面生成
def generate_surface(res_x=25, res_t=1151):"""生成極坐標曲面數據"""x, t = np.meshgrid(np.linspace(0, 1, res_x),np.linspace(-4 * np.pi, 26 * np.pi, res_t))p = (np.pi / 2) * np.exp(-t / (8 * np.pi)) # 衰減函數change = np.sin(20 * t) / 50 # 振蕩修正項u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi)**4 / 2 + changey = 2 * (x**2 - x)**2 * np.sin(p) # 縱向偏移r = 1.5 * u * (x * np.sin(p) + y * np.cos(p)) # 極徑計算h = u * (x * np.cos(p) - y * np.sin(p)) # 高度計算return r * np.cos(t), r * np.sin(t), h # 笛卡爾坐標轉換
3.2 動畫創建
def create_animation(xyz, elev=30, angle_step=2, interval=50):"""創建3D自動旋轉動畫"""fig = plt.figure(figsize=(8, 8))ax = fig.add_subplot(projection='3d')# 繪制彩色曲面ax.plot_surface(*xyz, cmap='magma', linewidth=0, antialiased=True)# 可視化優化ax.set_axis_off()plt.title('永生花開映摯愛', fontsize=16)# 動畫旋轉邏輯def _rotate(angle):ax.view_init(elev=elev, azim=angle)# 創建動畫對象ani = animation.FuncAnimation(fig, _rotate,frames=np.arange(0, 360, angle_step),interval=interval)plt.show()
四、效果展示
- 色彩映射:使用
magma
色板實現熔巖漸變效果 - 動態效果:通過每50ms旋轉2度實現平滑轉動
- 視覺優化:
- 隱藏坐標軸(
set_axis_off()
) - 抗鋸齒處理(
antialiased=True
) - 白色背景配置
- 隱藏坐標軸(
五、源碼展示
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation# 配置全局參數
plt.rcParams.update({'font.sans-serif': ['SimHei'], # 中文字體'axes.facecolor': 'white', # 坐標背景'savefig.facecolor': 'white'
})def generate_surface(res_x=25, res_t=1151):"""生成極坐標曲面數據"""x, t = np.meshgrid(np.linspace(0, 1, res_x),np.linspace(-4 * np.pi, 26 * np.pi, res_t))p = (np.pi / 2) * np.exp(-t / (8 * np.pi))change = np.sin(20 * t) / 50u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi) ** 4 / 2 + changey = 2 * (x**2 - x)**2 * np.sin(p)r = 1.5 * u * (x * np.sin(p) + y * np.cos(p))h = u * (x * np.cos(p) - y * np.sin(p))return r * np.cos(t), r * np.sin(t), hdef create_animation(xyz, elev=30, angle_step=2, interval=50):"""創建并播放3D自動旋轉動畫"""fig = plt.figure(figsize=(8, 8))ax = fig.add_subplot(projection='3d')# 繪制曲面ax.plot_surface(*xyz, cmap='magma', linewidth=0, antialiased=True)# 隱藏坐標軸和刻度ax.set_axis_off()plt.title('永生花開映摯愛', fontsize=16)# 旋轉函數def _rotate(angle):ax.view_init(elev=elev, azim=angle)ani = animation.FuncAnimation(fig, _rotate,frames=np.arange(0, 360, angle_step),interval=interval)plt.show()if __name__ == '__main__':xyz = generate_surface()create_animation(xyz)
六、總結
本文通過數學參數方程與Matplotlib三維可視化功能的結合,實現了一個富有藝術美感的數字永生花。該案例展示了如何將:
- 極坐標系轉換
- 參數化曲面生成
- 三維動畫控制
等關鍵技術有機結合。讀者可通過調整方程參數或更換色板(如viridis
、plasma
),創造出獨具個人風格的數字花卉。
完整代碼及運行環境要求見原文開頭部分。建議在Jupyter Notebook或支持交互繪圖的IDE中運行以獲得最佳動畫效果。