Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # spiral matrix
- # Joe, 13/12/2014
- import appuifw as A
- import graphics as G
- class Spiral:
- def gen(self,num):
- if num<=0:
- return []
- matrix=[row[:] for row in [[0]*num]*num]
- row1=0
- row2=num-1
- col1=0
- col2=num-1
- cur=1
- while 1:
- if cur>num*num:
- break
- for c in range(col1,col2+1):
- matrix[row1][c]=cur
- cur+=1
- row1+=1
- for r in range(row1,row2+1):
- matrix[r][col2]=cur
- cur+=1
- col2-=1
- for c in range(col2,col1-1,-1):
- matrix[row2][c]=cur
- cur+=1
- row2-=1
- for r in range(row2,row1-1,-1):
- matrix[r][col1]=cur
- cur+=1
- col1+=1
- return matrix
- class Board:
- def __init__(self,matrix):
- self.w,self.h=G.sysinfo.display_pixels()
- self.img=G.Image.new((self.w,self.h))
- self.run=False
- self.mat=matrix
- A.app.screen='full'
- self.c=A.Canvas(redraw_callback=self._redraw)
- A.app.body=self.c
- A.app.exit_key_handler=self.exit
- def exit(self):
- self.run=0 #A.app.set_exit()
- def _redraw(self,rect):
- if self.img:
- self.c.blit(self.img)
- def _tsize(self,text):
- if not isinstance(text,unicode):
- text=unicode(text)
- m=self.img.measure_text(text,font=u'latinplain12')[0]
- w,h=(m[2]-m[0],m[3]-m[1])
- return (w,h)
- def draw(self):
- self.run=True
- px,py=5,5
- pad=1
- width=20
- tx,tdx,title=5,3,u'Spiral Matrix'
- while self.run:
- self.img.clear(0)
- for i in range(len(self.mat)):
- for j in range(len(self.mat[i])):
- dx=px+(j*width)+(j*pad)
- dy=py+(i*width)+(i*pad)
- self.img.rectangle((dx,dy,dx+width,dy+width),fill=(0,255-(self.mat[i][j]*4),0))
- self.img.text((dx+4,dy+15),u'%d' %self.mat[i][j],0xffffff,'legend')
- if (tx+tdx > (self.w-self._tsize(title)[0])) or (tx+tdx < 0):tdx=-tdx
- tx=tx+tdx
- self.img.text((tx,self.h-10),title,0xffffff)
- self._redraw(0)
- A.e32.ao_sleep(1e-04)
- sp=Spiral()
- matrix=sp.gen(8) # menghasilkan matrix 8x8 (baca: dari sudut kiri atas kekanan berbentuk spiral berakhir di tengah)
- board=Board(matrix)
- board.draw()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement