[Art & Science] 用python绘制3D花(二)

引言

在这篇博客中分析了用python绘制3D花的原理,绘制了一个彩色的花。里面提到了6个idea(3D, center, radius&height, pattern, convex和approach),是时候应用这些原理,绘制一些现实中不同品种的的花(为原来的花继承一些花的子类),添加细节去丰富它。

其他种类的花

玫瑰花

  • 原始图片
    [Art & Science] 用python绘制3D花(二)_第1张图片
  • 特征:①叶片较宽,大概一片花瓣围绕中心轴的角度120°;②花瓣较往中心靠拢,故初相位可以尝试加上4pi到8pi之间;③边缘并不是完美的弧线,而是添加了些许扰动;④颜色修改成红色
  • 代码修改
# 省略了头文件,可以在之前的博客里看到
fig = plt.figure()
ax = fig.gca(projection='3d')
# 将相位向后移动了6*pi
[x, t] = np.meshgrid(np.array(range(25)) / 24.0, np.arange(0, 575.5, 0.5) / 575 * 20 * np.pi + 4*np.pi)
p = (np.pi / 2) * np.exp(-t / (8 * np.pi))
# 添加边缘扰动
change = np.sin(15*t)/150
# 将t的参数减少,使花瓣的角度变大
u = 1 - (1 - np.mod(3.3 * t, 2 * np.pi) / np.pi) ** 4 / 2 + change
y = 2 * (x ** 2 - x) ** 2 * np.sin(p)
r = u * (x * np.sin(p) + y * np.cos(p))
h = u * (x * np.cos(p) - y * np.sin(p))
c= cm.get_cmap('Reds')
surf = ax.plot_surface(r * np.cos(t), r * np.sin(t), h, rstride=1, cstride=1,
                       cmap= c, linewidth=0, antialiased=True)
plt.show()
  • 新图
    边缘扰动之前:
    [Art & Science] 用python绘制3D花(二)_第2张图片
    边缘扰动之后:
    [Art & Science] 用python绘制3D花(二)_第3张图片
    看出来边缘稍微的扰动使画面更逼真而立体

月季花

  • 原始图片
    [Art & Science] 用python绘制3D花(二)_第4张图片
  • 特征:①花瓣很多很密,可以将t的周期沿得更长,初相位更早;②颜色为粉色;③扰动的周期更长,扰动更剧烈;④半径比普通的花长
  • 代码:
fig = plt.figure()
ax = fig.gca(projection='3d')
[x, t] = np.meshgrid(np.array(range(25)) / 24.0, np.arange(0, 575.5, 0.5) / 575 * 30 * np.pi - 4*np.pi)
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 + change
y = 2 * (x ** 2 - x) ** 2 * np.sin(p)
r = u * (x * np.sin(p) + y * np.cos(p)) * 1.5
h = u * (x * np.cos(p) - y * np.sin(p))
c= cm.get_cmap('magma')
surf = ax.plot_surface(r * np.cos(t), r * np.sin(t), h, rstride=1, cstride=1,
                       cmap= c, linewidth=0, antialiased=True)
plt.show()
  • 图像
    [Art & Science] 用python绘制3D花(二)_第5张图片

桃花

  • 原始图片:
    [Art & Science] 用python绘制3D花(二)_第6张图片
  • 特征:①花瓣很小较窄,可以将t的周期变得更短,初相位更早;②颜色为淡粉色;③扰动的周期短,扰动更剧烈
  • 代码:
fig = plt.figure()
ax = fig.gca(projection='3d')
[x, t] = np.meshgrid(np.array(range(25)) / 24.0, np.arange(0, 575.5, 0.5) / 575 * 6 * np.pi - 4*np.pi)
p = (np.pi / 2) * np.exp(-t / (8 * np.pi))
change = np.sin(10*t)/20
u = 1 - (1 - np.mod(5.2 * t, 2 * np.pi) / np.pi) ** 4 / 2 + change
y = 2 * (x ** 2 - x) ** 2 * np.sin(p)
r = u * (x * np.sin(p) + y * np.cos(p)) * 1.5
h = u * (x * np.cos(p) - y * np.sin(p))
c= cm.get_cmap('spring_r')
surf = ax.plot_surface(r * np.cos(t), r * np.sin(t), h, rstride=1, cstride=1,
                       cmap= c, linewidth=0, antialiased=True)
plt.show()
  • 图像
    [Art & Science] 用python绘制3D花(二)_第7张图片
    由于时间关系,只能草草做了3个品种的花,但以python的强大功能,我们还能尝试更多,更精妙的算法。不仅仅在颜色、扰动、大小上变化。我们还能改变花的形态,甚至创造出一些生活中本来不存在的花,更加充分感受科学与艺术的结合。

你可能感兴趣的:(Art,&,Science,Python)