您的当前位置:首页正文

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

2020-11-27 来源:欧得旅游网
这里是显示彭罗斯点阵的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),"
 "[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程序。如果你知道其它的例子,可以在评论中告诉我。

显示全文