效果是不是很漂亮呢?
代码如下:
#----------------------------------------- # Python + Matplotlib 绘制 Penrose 铺砌 # by Zhao Liang [email protected] #----------------------------------------- import matplotlib.pyplot as plt import numpy as np from matplotlib.path import Path from matplotlib.patches import PathPatch plt.figure(figsize=(8,6),dpi=100) plt.subplot(aspect=1) plt.axis([-0.6,0.6,-0.6,0.6]) plt.xticks([]) plt.yticks([]) plt.axis(‘off‘) a = 0.5*(np.sqrt(5)-1) ‘‘‘ 所有要绘制的三角形都放在一个列表中,列表的每个元素形如 [color, A, B ,C],其中 color = 0, 1 表示两种颜色之一, A, B, C 是 np.array 数组表示三角形三个顶点的坐标. 每次把切割后的小三角形放在一个新的列表 result 里面然后 返回 result. ‘‘‘ def subdivide(triangles): result = [] for color,A,B,C in triangles: if color == 0: P = A + (B-A)*a result += [(0,C,P,B),(1,P,C,A)] else: Q = B+(A-B)*a R = B+(C-B)*a result +=[(1,R,C,A),(1,Q,R,B),(0,R,Q,A)] return result ‘‘‘ 画图没有什么好说的,注意三角形 ABC 的底边 BC 是永远不画的,它们是 合并为菱形时的边界. ‘‘‘ def DrawFigure(triangles): for color,A,B,C in triangles: vertices = [C,A,B] codes = [Path.MOVETO]+[Path.LINETO]*2 tri = Path(vertices,codes) if color == 0: tri_patch=PathPatch(tri,facecolor=‘#FF0099‘,edgecolor=‘#666666‘,linewidth=0.8) else: tri_patch=PathPatch(tri,facecolor=‘#66CCFF‘,edgecolor=‘#666666‘,linewidth=0.8) plt.gca().add_patch(tri_patch) plt.show() triangles = [] A=np.array([0,0]) for i in range(10): B = np.array([np.cos(0.2*np.pi*i),np.sin(0.2*np.pi*i)]) C = np.array([np.cos(0.2*np.pi*(i+1)),np.sin(0.2*np.pi*(i+1))]) if i%2 == 0: B , C = C, B triangles.append([0,A,B,C]) m = input(‘Enter number of divisions: ‘) for j in xrange(m): triangles=subdivide(triangles) DrawFigure(triangles)
时间: 2024-10-26 19:03:50