Python编程利用科赫曲线实现三维飘雪效果示例过程
本文详细介绍如何使用Python和Matplotlib库,基于科赫曲线算法生成三维飘雪效果。内容涵盖从随机点枝杈绘制到科赫雪花生成逻辑,再到利用PolyCollection构建3D实心雪花的完整代码实现,帮助开发者掌握分形几何在图形渲染中的应用。
随机雪花
若尝试随机生成一系列点,并为每个点绘制若干分支,可得到类似蒲公英的结构,尽管视觉效果并不理想。

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import rand,randint
M,N = 10,100
x = rand(N)*100
y = rand(N)*100
plt.scatter(x,y,marker='.')
for i in range(N):
M = randint(5,15)
r = rand()*3
for j in range(M):
theta = np.pi*2/M*j
plt.plot([x[i],x[i]+r*np.cos(theta)],
[y[i],y[i]+r*np.sin(theta)])
plt.axis('off')
plt.show()
即便尝试将其转化为三维图形,最终呈现的效果依然不够美观。

科赫雪花
既然目标是模拟飘雪,首先需要生成雪花形态。科赫曲线因其形状酷似雪花,常被称为雪花曲线,其生成过程仅需两个步骤。
首先绘制一个正三角形,将该三角形的每条边三等分,并以中间那段为边向外绘制一个新的三角形。重复执行此步骤即可得到更复杂的雪花形状。
其中的难点在于三等分后如何确定新三角形的绘制位置,特别是新顶点的坐标计算。

通过几何推导可得新顶点的坐标公式。



具体实现代码如下。
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import rand,randint
# n>=1,生成科赫雪花的方法
def Koch(L,n=1):
if n<1 : return
newL = [] #(x,y)的列表
for i in range(len(L)-1):
delta = (L[i+1]-L[i])/3
x = (L[i][0]+L[i+1][0])/2-np.sqrt(3)/2*delta[1]
y = (L[i][1]+L[i+1][1])/2+np.sqrt(3)/2*delta[0]
newL += [L[i],L[i]+delta,np.array([x,y]),L[i]+delta*2]
newL.append(L[-1])
return newL if n==1 else Koch(newL,n-1)
L0 = [
np.array([0,0]),
np.array([0.5,np.sqrt(3)/2]),
np.array([1,0]),
np.array([0,0])
]
def plot_Koch(L):
for i in range(len(L)-1):
p = np.array(L[i:i+2]).T
plt.plot(p[0],p[1],color='lightblue',lw = 1)
plt.xlim(-0.25,1.25)
plt.ylim(-0.5,1.25)
plt.show()
if __name__ == "__main__":
plot_Koch(Koch(L0,3))
增加生成数量后,效果如下所示。

其生成逻辑如下。
#n为雪花数量,low,high为最低和最高koch雪花阶数
def RandKoch(n,low,high):
randKochs = []
rMax = np.sqrt(1/n)
for _ in range(n):
cx,cy,t0 = rand(3)
r = rand()*rMax
L0 = [np.array([np.cos(t),np.sin(t)])*r+[cx,cy]
for t in (t0-np.arange(4)*np.pi*2/3)]
randKochs.append(Koch(L0,randint(low,high)))
return randKochs
def plot_Kochs(Ls):
for L in Ls:
for i in range(len(L)-1):
p = np.array(L[i:i+2]).T
plt.plot(p[0],p[1],color='lightblue',lw = 1)
plt.xlim(-0.2,1.2)
plt.ylim(-0.2,1.2)
plt.show()
若使用plt.fill(x,y)进行填充,则可绘制出实心的雪花图案。

def plot_Kochs(Ls):
for L in Ls:
x,y = np.array(L).T
plt.fill(x, y, color = 'lightblue')
plt.xlim(-0.2,1.2)
plt.ylim(-0.2,1.2)
plt.show()
三维
为了营造飘雪的视觉感受,必须引入三维坐标系,这只需在绘图时添加Z轴坐标即可实现。

#导入PolyCollection绘制实心的3D图形
from mpl_toolkits.mplot3d.art3d import PolyCollection
def plot_Kochs_fill3d(Ls):
fig = plt.figure()
ax = fig.gca(projection='3d')
p3d = PolyCollection(Ls,facecolors=np.repeat('lightblue',len(Ls)),alpha=0.7)
ax.add_collection3d(p3d,zs=rand(len(Ls)),zdir='y')
ax.set_xlim3d(0,1)
ax.set_ylim3d(0,1)
ax.set_zlim3d(0,1)
plt.show()
以上即为Python编程实现三维飘雪效果的详细过程,更多关于Python编程实现三维飘雪的参考资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













