Advertisement
phjoe

Spiral Matrix

Dec 13th, 2014
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # spiral matrix
  2. # Joe, 13/12/2014
  3.  
  4. import appuifw as A
  5. import graphics as G
  6.  
  7. class Spiral:
  8.  def gen(self,num):
  9.   if num<=0:
  10.    return []
  11.   matrix=[row[:] for row in [[0]*num]*num]
  12.   row1=0
  13.   row2=num-1
  14.   col1=0
  15.   col2=num-1
  16.   cur=1
  17.   while 1:
  18.    if cur>num*num:
  19.     break
  20.    for c in range(col1,col2+1):
  21.     matrix[row1][c]=cur
  22.     cur+=1
  23.    row1+=1
  24.    for r in range(row1,row2+1):
  25.     matrix[r][col2]=cur
  26.     cur+=1
  27.    col2-=1
  28.    for c in range(col2,col1-1,-1):
  29.     matrix[row2][c]=cur
  30.     cur+=1
  31.    row2-=1
  32.    for r in range(row2,row1-1,-1):
  33.     matrix[r][col1]=cur
  34.     cur+=1
  35.    col1+=1
  36.   return matrix
  37.  
  38.  
  39. class Board:
  40.  def __init__(self,matrix):
  41.   self.w,self.h=G.sysinfo.display_pixels()
  42.   self.img=G.Image.new((self.w,self.h))
  43.   self.run=False
  44.   self.mat=matrix
  45.   A.app.screen='full'
  46.   self.c=A.Canvas(redraw_callback=self._redraw)
  47.   A.app.body=self.c
  48.   A.app.exit_key_handler=self.exit
  49.  
  50.  def exit(self):
  51.   self.run=0 #A.app.set_exit()
  52.  
  53.  def _redraw(self,rect):
  54.   if self.img:
  55.    self.c.blit(self.img)
  56.  
  57.  def _tsize(self,text):
  58.   if not isinstance(text,unicode):
  59.    text=unicode(text)
  60.   m=self.img.measure_text(text,font=u'latinplain12')[0]
  61.   w,h=(m[2]-m[0],m[3]-m[1])
  62.   return (w,h)
  63.  
  64.  def draw(self):
  65.   self.run=True
  66.   px,py=5,5
  67.   pad=1
  68.   width=20
  69.   tx,tdx,title=5,3,u'Spiral Matrix'
  70.   while self.run:
  71.    self.img.clear(0)
  72.    for i in range(len(self.mat)):
  73.     for j in range(len(self.mat[i])):
  74.      dx=px+(j*width)+(j*pad)
  75.      dy=py+(i*width)+(i*pad)
  76.      self.img.rectangle((dx,dy,dx+width,dy+width),fill=(0,255-(self.mat[i][j]*4),0))
  77.      self.img.text((dx+4,dy+15),u'%d' %self.mat[i][j],0xffffff,'legend')
  78.  
  79.    if (tx+tdx > (self.w-self._tsize(title)[0])) or (tx+tdx < 0):tdx=-tdx
  80.    tx=tx+tdx
  81.    self.img.text((tx,self.h-10),title,0xffffff)
  82.    self._redraw(0)
  83.    A.e32.ao_sleep(1e-04)
  84.  
  85.  
  86. sp=Spiral()
  87. matrix=sp.gen(8) # menghasilkan matrix 8x8 (baca: dari sudut kiri atas kekanan berbentuk spiral berakhir di tengah)
  88.  
  89. board=Board(matrix)
  90. board.draw()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement