欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-13 13:01:52
这里是显示彭罗斯点阵的python的脚本。是的,这是可以运行的有效phython代码。 译注:彭罗斯点阵,物理学术语。上世纪70年代英国数学家彭罗斯第一次提出了这个概念,...

这里是显示彭罗斯点阵的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立体效应渲染的彭罗斯点阵。这里是该图像的一部分(点击放大)。

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

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

编注:pycairo是一组python版本的cario图形库。

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

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

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