#
 
g.norefresh()  
 
def lerp(x,y,step):
	return x*(1.0-step)+y*step

def drawPoly(points):
	for n in range(len(points)-1):
		g.line(points[n][0],points[n][1],points[n+1][0],points[n+1][1])

p1 = [[10,10],[50,50],[40,40],[10,10],[10,10]]
p2 = [[60,30],[60,80],[80,80],[80,30],[60,30]]
p3 = [[10,10],[50,50],[10,10]]
p4 = [[80,30],[60,90],[80,80]] 
 

def lerpPoly(p1,p2,step):
	#for now, assume equal number of points
	p3 = []	
	for n in range(len(p1)):
		x = int(lerp(p1[n][0],p2[n][0],step))
		y = int(lerp(p1[n][1],p2[n][1],step))
		p3.append((x,y))
	return p3

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])

g.pen(100)

for n in range(0, 101, 7):
	drawPoly(lerpPoly(p3,p4,n/float(100)))

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

buf = copyRect(10,10,62,80)

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 

def funkify(buf):
	for i in range(len(buf)):
		for j in range(len(buf[0])):
			buf[i][j] = buf[i][j]*buf[i][j]/85
	return buf

for n in range(14):
	buf = blur(buf)

buf = funkify(buf)

g.paper(0)
 
for n in range(0, 101, 10):
	g.refresh()
	g.paper(0)
	#time.sleep(0.04)
	blamRect(buf, 9, 9,-1)
	drawPoly(lerpPoly(p1,p2,n/float(100)))
	#drawPoly(lerpPoly(p3,p4,n/float(100)))
        drawPoly(p1)