下面是结合数学方程和可视化技巧,生成一个炫酷的爱心效果:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 创建画布
fig = plt.figure(figsize=(8, 8))
ax = plt.axes(xlim=(-2.5, 2.5), ylim=(-3, 2))
ax.set_facecolor('black') # 设置黑色背景
plt.axis('off')
# 爱心参数方程(改进版)
def heart(t):
t = np.radians(t)
x = 1.5 * (16 * np.sin(t)**3)
y = 1.5 * (13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t))
return x/20, y/20 # 缩放尺寸
# 生成角度数组
theta = np.linspace(0, 360, 1000)
# 初始化散点
scat = ax.scatter([], [], c=[], cmap='rainbow', s=40, alpha=0.7, edgecolors='w')
# 创建动画函数
def animate(angle):
# 生成旋转矩阵
rad = np.radians(angle)
rot_matrix = np.array([[np.cos(rad), -np.sin(rad)],
[np.sin(rad), np.cos(rad)]])
# 生成基础爱心坐标
x, y = heart(theta)
points = np.vstack((x, y))
# 应用旋转
rotated = np.dot(rot_matrix, points)
# 颜色渐变参数(随时间变化)
colors = np.sin(0.1*theta + np.radians(angle)*2)
# 更新散点属性
scat.set_offsets(rotated.T)
scat.set_array(colors)
scat.set_sizes(np.linspace(30, 60, len(theta))) # 大小渐变
# 添加随机星星特效
stars_x = np.random.uniform(-2.5, 2.5, 30)
stars_y = np.random.uniform(-3, 2, 30)
sizes = np.random.uniform(10, 100, 30)
plt.scatter(stars_x, stars_y, s=sizes, c='white', alpha=0.3, edgecolors='none')
return scat,
# 创建动画
ani = FuncAnimation(fig, animate, frames=np.arange(0, 360, 2), interval=50)
# 添加标题
plt.title('Creative Rotating Heart', color='white', fontsize=16, y=0.9)
# 显示动画
plt.show()
代码解析:
-
数学方程:使用改进的心形参数方程,通过组合多个余弦项创建更柔和的爱心形状
-
动态效果:
-
实时旋转:使用旋转矩阵实现平滑旋转
-
颜色渐变:彩虹色系映射结合角度参数
-
大小渐变:点的大小从30到60渐变
- 视觉效果增强:
-
黑色背景与白色边框点
-
半透明效果(alpha=0.7)
-
随机星星特效(每次刷新随机生成)
- 参数调整技巧:
-
缩放系数(1.5倍原始方程)
-
角度采样密度(1000个点)
-
旋转速度(每帧2度)
进阶改进建议:
- 添加3D效果:
from mpl_toolkits.mplot3d import Axes3D
ax = fig.add_subplot(111, projection='3d')
# 在z轴添加波动:z = 0.5 * np.sin(2*t)
- 自定义颜色映射:
colors = np.linspace(0, 1, len(theta))
cmap = plt.cm.get_cmap('hsv', 256)
- 添加交互功能:
def onclick(event):
# 点击生成文字特效
plt.text(event.xdata, event.ydata, '❤', color='red', fontsize=20)
fig.canvas.mpl_connect('button_press_event', onclick)
这个动画会生成一个持续旋转的渐变爱心,背景带有随机闪烁的星星特效。颜色会随着旋转角度动态变化,每个点的大小也呈现渐变效果,整体呈现出梦幻般的视觉效果。可以通过调整colormap(‘rainbow’)、旋转速度(interval参数)和缩放系数来创建不同风格的爱心效果。