(root)/
Python-3.12.0/
Lib/
turtledemo/
penrose.py
       1  #!/usr/bin/env python3
       2  """       xturtle-example-suite:
       3  
       4            xtx_kites_and_darts.py
       5  
       6  Constructs two aperiodic penrose-tilings,
       7  consisting of kites and darts, by the method
       8  of inflation in six steps.
       9  
      10  Starting points are the patterns "sun"
      11  consisting of five kites and "star"
      12  consisting of five darts.
      13  
      14  For more information see:
      15   http://en.wikipedia.org/wiki/Penrose_tiling
      16   -------------------------------------------
      17  """
      18  from turtle import *
      19  from math import cos, pi
      20  from time import perf_counter as clock, sleep
      21  
      22  f = (5**0.5-1)/2.0   # (sqrt(5)-1)/2 -- golden ratio
      23  d = 2 * cos(3*pi/10)
      24  
      25  def kite(l):
      26      fl = f * l
      27      lt(36)
      28      fd(l)
      29      rt(108)
      30      fd(fl)
      31      rt(36)
      32      fd(fl)
      33      rt(108)
      34      fd(l)
      35      rt(144)
      36  
      37  def dart(l):
      38      fl = f * l
      39      lt(36)
      40      fd(l)
      41      rt(144)
      42      fd(fl)
      43      lt(36)
      44      fd(fl)
      45      rt(144)
      46      fd(l)
      47      rt(144)
      48  
      49  def inflatekite(l, n):
      50      if n == 0:
      51          px, py = pos()
      52          h, x, y = int(heading()), round(px,3), round(py,3)
      53          tiledict[(h,x,y)] = True
      54          return
      55      fl = f * l
      56      lt(36)
      57      inflatedart(fl, n-1)
      58      fd(l)
      59      rt(144)
      60      inflatekite(fl, n-1)
      61      lt(18)
      62      fd(l*d)
      63      rt(162)
      64      inflatekite(fl, n-1)
      65      lt(36)
      66      fd(l)
      67      rt(180)
      68      inflatedart(fl, n-1)
      69      lt(36)
      70  
      71  def inflatedart(l, n):
      72      if n == 0:
      73          px, py = pos()
      74          h, x, y = int(heading()), round(px,3), round(py,3)
      75          tiledict[(h,x,y)] = False
      76          return
      77      fl = f * l
      78      inflatekite(fl, n-1)
      79      lt(36)
      80      fd(l)
      81      rt(180)
      82      inflatedart(fl, n-1)
      83      lt(54)
      84      fd(l*d)
      85      rt(126)
      86      inflatedart(fl, n-1)
      87      fd(l)
      88      rt(144)
      89  
      90  def draw(l, n, th=2):
      91      clear()
      92      l = l * f**n
      93      shapesize(l/100.0, l/100.0, th)
      94      for k in tiledict:
      95          h, x, y = k
      96          setpos(x, y)
      97          setheading(h)
      98          if tiledict[k]:
      99              shape("kite")
     100              color("black", (0, 0.75, 0))
     101          else:
     102              shape("dart")
     103              color("black", (0.75, 0, 0))
     104          stamp()
     105  
     106  def sun(l, n):
     107      for i in range(5):
     108          inflatekite(l, n)
     109          lt(72)
     110  
     111  def star(l,n):
     112      for i in range(5):
     113          inflatedart(l, n)
     114          lt(72)
     115  
     116  def makeshapes():
     117      tracer(0)
     118      begin_poly()
     119      kite(100)
     120      end_poly()
     121      register_shape("kite", get_poly())
     122      begin_poly()
     123      dart(100)
     124      end_poly()
     125      register_shape("dart", get_poly())
     126      tracer(1)
     127  
     128  def start():
     129      reset()
     130      ht()
     131      pu()
     132      makeshapes()
     133      resizemode("user")
     134  
     135  def test(l=200, n=4, fun=sun, startpos=(0,0), th=2):
     136      global tiledict
     137      goto(startpos)
     138      setheading(0)
     139      tiledict = {}
     140      tracer(0)
     141      fun(l, n)
     142      draw(l, n, th)
     143      tracer(1)
     144      nk = len([x for x in tiledict if tiledict[x]])
     145      nd = len([x for x in tiledict if not tiledict[x]])
     146      print("%d kites and %d darts = %d pieces." % (nk, nd, nk+nd))
     147  
     148  def demo(fun=sun):
     149      start()
     150      for i in range(8):
     151          a = clock()
     152          test(300, i, fun)
     153          b = clock()
     154          t = b - a
     155          if t < 2:
     156              sleep(2 - t)
     157  
     158  def main():
     159      #title("Penrose-tiling with kites and darts.")
     160      mode("logo")
     161      bgcolor(0.3, 0.3, 0)
     162      demo(sun)
     163      sleep(2)
     164      demo(star)
     165      pencolor("black")
     166      goto(0,-200)
     167      pencolor(0.7,0.7,1)
     168      write("Please wait...",
     169            align="center", font=('Arial Black', 36, 'bold'))
     170      test(600, 8, startpos=(70, 117))
     171      return "Done"
     172  
     173  if __name__ == "__main__":
     174      msg = main()
     175      mainloop()