用Python代码来绘制彭罗斯点阵的教程

yipeiwu_com5年前Python基础

这里是显示彭罗斯点阵的Python的脚本。是的,这是可以运行的有效Phython代码。

译注:彭罗斯点阵,物理学术语。上世纪70年代英国数学家彭罗斯第一次提出了这个概念,称为彭罗斯点阵(Pen-rose tiles)。
 

_                 =\
                """if!
               1:"e,V=100
              0,(0j-1)**-.2;
              v,S=.5/ V.real,
             [(0,0,4   *e,4*e*
            V)];w=1     -v"def!
           E(T,A,       B,C):P
         ,Q,R=B*w+        A*v,B*w+C
      *v,A*w+B*v;retur       n[(1,Q,C,A),(1,P
   ,Q,B),(0,Q,P,A)]*T+[(0,C      ,R,B),(1,R,C,A)]*(1-T)"f
or!i!in!_[:11]:S    =sum([E     (*x)for    !x!in!S],[])"imp
 ort!cair        o!as!O;   s=O.Ima        geSurfac
  e(1,e,e)        ;c=O.Con text(s);        M,L,G=c.
   move_to        ,c.line_to,c.s        et_sour
    ce_rgb        a"def!z(f,a)        :f(-a.
    imag,a.    real-e-e)"for!T,A,B,C!in[i    !for!i!
     in!S!if!i[""";exec(reduce(lambda x,i:x.replace(chr
      (i),"\n "[34-i:]),  range(  35),_+"""0]]:z(M,A
       );z(L,B);z     (L,C);     c.close_pa
       th()"G       (.4,.3       ,1);c.
       paint(       );G(.7       ,.7,1)
       ;c.fil       l()"fo       r!i!in
       !range       (9):"!       g=1-i/
       8;d=i/     4*g;G(d,d,d,     1-g*.8
       )"!def   !y(f,a):z(f,a+(1+2j)*(   1j**(i
       /2.))*g)"!for!T,A,B,C!in!S:y(M,C);y(L,A);y(M
       ,A);y(L,B)"!c.st      roke()"s.write_t
       o_png('pen            rose.png')
       """                    ))

当这个程序运行时,它输出了一个1000×1000的图像文件,包含大约2212个由3D立体效应渲染的彭罗斯点阵。这里是该图像的一部分(点击放大)。

201543160355517.jpg (531×459)

运行该脚本需要Pycairo。它只在Python它是标准的Python脚本,但我努力想把它变得更简洁,于是我又从中删减了一些。

编注:Pycairo是一组Python版本的Cario图形库。

彭罗斯点阵很酷,因为它们非周期性地覆盖了整个平面——图片的转换副本与原型从来不会一致。它们是由Roger Penrose先生通过将五边形的平面平铺在一起的一系列尝试而发明的。

与C或Perl相比,Python并不是让人迷惑的编程语言。这种比较似乎也从未发生,而且在网上也没有多少让人费解的Python的例子:你可以在官方的Python常见问题中或各种网页如这里和这里找到一些例子。在2011年的PyCon对此还有专题讨论。

我相信输出一个高分辨率的图像是第一个让人费解的Python程序。如果你知道其它的例子,可以在评论中告诉我。

相关文章

python读csv文件时指定行为表头或无表头的方法

python读csv文件时指定行为表头或无表头的方法

pd.read_csv()方法中header参数,默认为0,标签为0(即第1行)的行为表头。若设置为-1,则无表头。示例如下: (1)不设置header参数(默认)时: df1 =...

Python切片知识解析

切片原型 strs = ‘abcdefg' Strs[start: end:step] 切片的三个参数分别表开始,结束,步长 第一位下标为0,end位不取,如strs[1:3] = ‘b...

python re正则匹配网页中图片url地址的方法

python re正则匹配网页中图片url地址的方法

最近写了个python抓取必应搜索首页http://cn.bing.com/的背景图片并将此图片更换为我的电脑桌面的程序,在正则匹配图片url时遇到了匹配失败问题。 要抓取的图片地址如图...

Django admin美化插件suit使用示例

Django admin美化插件suit使用示例

本文主要对Django美化插件做一个简单介绍,具体如下。 Django Suit 效果 使用前django页面 使用后django页面 安装 官方文档 http://django-s...

python+POP3实现批量下载邮件附件

最近新开学,接到了给老板的本科课程当助教的工作,百十来号人一学期下来得有四五次作业发进邮箱里,需要我来统计打分,想想挨个点进去下载附件的过程就头大,于是萌生了写个脚本来统计作业的想法。...