prog2_map_anim

1905 days ago by macieksk

#pastebin: http://pastebin.com/c1Wv4wai 
       
import matplotlib from matplotlib import pyplot as plt import numpy as np from numpy import zeros import random import threading import Queue import time class Map(object): # Functions which return color arrays to be ploted def black(self): return zeros((self._h,self._w,3), dtype='uint8') def red(self): red = self.black() red[:,:,0] = 255 return red def green(self): red = self.black() red[:,:,1] = 255 return red def blue(self): red = self.black() red[:,:,2] = 255 return red def yellow(self): red = self.red() red[:,:,1] = 255 return red def ants(self): from scipy import rand, dstack return dstack([(255*rand(self._h,self._w)).astype('uint8')]*3) def __init__(self, draw_fun, w = 20, h = 20, s=10,interval = 1): self._w, self._h = w*s, h*s self._s = s # One Block size self._sleep_time = interval self._draw_fun = draw_fun self._fig = plt.figure() self._nsub=1 #Number of subplots #Create subplots self._axs = [self._fig.add_subplot(1,self._nsub,i) for i in xrange(self._nsub)] [ax.imshow(self.black()) for ax in self._axs] #Grab buttonclick self._fig.canvas.mpl_connect('button_press_event', self._on_click) #Setup queues and flags self._upd_flag = threading.Event() self._draw_q = Queue.Queue() def _animate(self,ax): ax.images[0].set_data(self.ants()) ax.figure.canvas.draw() time.sleep(self._sleep_time) try: while True: data = self._draw_q.get(timeout=self._sleep_time) time.sleep(self._sleep_time) #ax.images[0].set_data(random.choice([self.red(),self.green(),self.blue()])) ax.images[0].set_data(data) ax.figure.canvas.draw() except: pass #Simply exit if nothing in the queue finally: self._upd_flag.clear() def _on_click(self,event): #if event.inaxes in self.axs: # update_axs = [event.inaxes] #Run animation if no animation already running if not self._upd_flag.is_set(): t =threading.Thread(target=self._animate,args=(self._axs[0],)) t2=threading.Thread(target=self._draw_fun,args=(self,)) t.daemon=True t2.daemon=True self._upd_flag.set() t.start() t2.start() def plot_map(self,arr): ''' Issue a pixel array to draw with cell colors translated appropriately from a logical smaller array 'arr' ''' s=self._s assert(arr.shape == (self._w/s,self._h/s)) todraw = self.black() def set_color(col_n, color): for x,y in zip(*np.where(arr==col_n)): todraw[s*x:s*(x+1),s*y:s*(y+1),:] = color[s*x:s*(x+1),s*y:s*(y+1),:] set_color(1,self.red()) set_color(2,self.blue()) set_color(3,self.green()) set_color(4,self.yellow()) self._draw_q.put(todraw) ###Example code def test_map(mp): arr=np.zeros((10,10)) arr[1,1]=1 arr[1,2]=1 arr[5,6]=2 arr[9,9]=3 mp.plot_map(arr) def runme(): for i in range(10): arr[i,i]=4 mp.plot_map(arr) runme() def test(): mp=Map(test_map,w=10,h=10,s=15,interval=0.5) plt.show()