# # theme: water # words: drip, stain, flow g.norefresh() seed = (1633, 241, 512) def f1(): global seed x, y, z = seed x = (171 * x) % 30269 y = (172 * y) % 30307 z = (170 * z) % 30323 seed = x, y, z return (x/30269.0 + y/30307.0 + z/30323.0) % 1.0 flowmap = [] for i in range(101): flowmap.append([]) for j in range(101): flowmap[i].append(f1()*5+2) import math import time def blamRect(buf, x,y,alpha): #Should this scale also? if alpha < 0: #might speed this up for i in range(len(buf)): for j in range(len(buf[0])): g.setPixel(x+i,y+j,buf[i][j]) else: for i in range(len(buf)): for j in range(len(buf[0])): if buf[i][j] != alpha: g.setPixel(x+i,y+j,buf[i][j]) def copyRect(x,y,w,h): buf = [] for i in range(x,x+w): buf.append([]) for j in range(y,y+h): buf[-1].append(g.getPixel(i,j)) return buf def blur(buf): for i in range(1,len(buf)-1): for j in range(1,len(buf[0])-1): buf[i][j] = (buf[i+1][j] + buf[i-1][j] + buf[i][j+1] + buf[i][j-1] + buf[i][j])/5 for i in range(1,len(buf)-1): buf[i][0] = (buf[i][0] + buf[i][1] + buf[i-1][0] + buf[i+1][0]) / 4 buf[i][-1] = (buf[i][-1] + buf[i][-2] + buf[i-1][-1] + buf[i+1][-1]) / 4 for j in range(1,len(buf[0])-1): buf[0][j] = (buf[0][j] + buf[1][j] + buf[0][j-1] + buf[0][j+1]) / 4 buf[-1][j] = (buf[-1][j] + buf[-2][j] + buf[-1][j-1] + buf[-1][j+1]) / 4 buf[0][0] = (buf[0][0] + buf[0][1] + buf[1][0]) /3 buf[0][-1] = (buf[0][-1] + buf[1][-1] + buf[0][-2]) /3 buf[-1][0] = (buf[-1][0] + buf[-1][1] + buf[-2][0]) /3 buf[-1][-1] = (buf[-1][-1] + buf[-2][-1] + buf[-1][-2]) /3 return buf def darken(buf, factor): for i in range(len(buf)): for j in range(len(buf[0])): buf[i][j] = int(buf[i][j]*factor) return buf bleed = {} while 1: minx = 100 maxx = 0 miny = 100 maxy = 0 time.sleep(0.1) if g.getMouse(3): x = g.getMouse(1) y = g.getMouse(2) bleed[(x,y)] = 80 for point in bleed.keys(): if not bleed[point] > 10: del(bleed[point]) continue x, y = point if x < minx: minx = x if x > maxx: maxx = x if y < miny: miny = y if y > miny: maxy = y if not bleed.has_key((x-1,y)): bleed[(x-1,y)] = bleed[point] - flowmap[x-1][y] if not bleed.has_key((x,y-1)): bleed[(x,y-1)] = bleed[point] - flowmap[x][y-1] if not bleed.has_key((x+1,y)): bleed[(x+1,y)] = bleed[point] - flowmap[x+1][y] if not bleed.has_key((x,y+1)): bleed[(x,y+1)] = bleed[point] - flowmap[x][y+1] if not bleed.has_key((x+1,y+1)): bleed[(x+1,y+1)] = 0.7 * bleed[point] - flowmap[x+1][y+1] if not bleed.has_key((x-1,y+1)): bleed[(x-1,y+1)] = 0.7* bleed[point] - flowmap[x-1][y+1] if not bleed.has_key((x+1,y-1)): bleed[(x+1,y-1)] = 0.7*bleed[point] - flowmap[x+1][y-1] if not bleed.has_key((x-1,y-1)): bleed[(x-1,y-1)] =0.7* bleed[point] - flowmap[x-1][y-1] bleed[point] = bleed[point] - flowmap[x][y] g.paper(0) for point in bleed.keys(): x,y = point g.setPixel(x,y,int(bleed[point])) if minx > maxx - 2: continue if miny > maxy - 2: continue buf = copyRect(minx-1,miny-1,maxx+1-minx,maxy+1-miny) blur(buf) blur(buf) blamRect(buf,minx,miny,-1) g.refresh()