Python + Matplotlib 绘制 Penrose 铺砌

效果是不是很漂亮呢?

代码如下:

  

#-----------------------------------------

#  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

Python + Matplotlib 绘制 Penrose 铺砌的相关文章

Python + Matplotlib 绘制 Aztec Diamond 图的随机铺砌

一个 $n$ 阶的 Aztec Diamond 图,是指依次将 $2,4,\ldots,2n,2n,\ldots,4,2$ 个单位方格摞在一起得到的对称图形(于是图中一共有 $2n(n+1)$ 个单位方格).下图是 $n=5$ 时候的例子: 对一个 $n$ 阶的 Aztec Diamond 图,用 $1\times 2$ 的多米诺骨牌铺砌它,总共有 $2^{n(n+1)}$ 种不同的方法.(这里不考虑对称性,比如全部用水平的骨牌铺砌和全部用竖直的骨牌铺砌,两种方法是不同的) 一个有趣的问题是,对

python+matplotlib 绘制等高线

python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵m*n维,可见与data同) 构造网格坐标矩阵X,Y 进行颜色填充 画等高线 等高线的描述 删掉坐标系 1. 构造一下高度矩阵: def f(x,y): """ 计算高度的函数 :param x: 向量 :param y: 向量 :return: dim(x)*dim(y)维的矩

python matplotlib 绘制三次函数图像

安装的是anaconda, 其中包含了numpy, scipy, matplotlib 等科学计算包 https://www.continuum.io/downloads 在终端打开anaconda中的python /home/qi/anaconda/bin/python >>> from matplotlib import pyplot as pl >>> import numpy as np >>> from scipy import interp

python+matplotlib+绘制不同图标类型

#==================================================================#首先需要导入两个文件import matplotlib.pyplot as pltimport numpy as np#================================================================== 1 #====================================================

Python + Matplotlib 绘制 Mandelbrot 集合

这方面网上的代码俯拾皆是,这里贴一个代码简洁的版本,效果也是很不错的.

广义mandelbrot集,使用python的matplotlib绘制,支持放大缩小

迭代公式的指数,使用的1+5j,这是个复数,所以是广义mandelbrot集,大家可以自行修改指数,得到其他图形.各种库安装不全的,自行想办法,可以在这个网站找到几乎所有的python库 http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib #encoding=utf-8 import numpy as np import pylab as pl import time from matplotlib import cm from math

Python 使用 matplotlib绘制3D图形

3D图形在数据分析.数据建模.图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何在Python中使用 matplotlib进行3D图形的绘制,包括3D散点.3D表面.3D轮廓.3D直线(曲线)以及3D文字等的绘制. 准备工作: python中绘制3D图形,依旧使用常用的绘图模块matplotlib,但需要安装mpl_toolkits工具包,安装方法如下:windows命令行进入到python安装目录下的Scripts文件夹下,执行: pip install --upgrade ma

python matplotlib模块——绘制三维图形、三维数据散点图(转)

转自https://blog.csdn.net/eddy_zheng/article/details/48713449 python matplotlib模块,是扩展的MATLAB的一个绘图工具库.他可以绘制各种图形,可是最近最的一个小程序,得到一些三维的数据点图,就学习了下python中的matplotlib模块,如何绘制三维图形. 初学者,可能对这些第三方库安装有一定的小问题,对于一些安装第三方库经验较少的朋友,建议使用 Anaconda ,集成了很多第三库,基本满足大家的需求,下载地址,对

Python使用matplotlib绘制三维曲线

本文主要演示如何使用matplotlib绘制三维图形 代码如下: # -*- coding: UTF-8 -*- import matplotlib as mpl from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt # 设置图例字号 mpl.rcParams['legend.fontsize'] = 10 fig = plt.figure() # 设置三维图形模式 a