###############################################################
#pong
#simple point in space with no physic
###############################################################

#dependency
###############################################################
from vector import *
from collision import *

#container
###############################################################
class pong:
    def __init__(self,x,y):
        self.pos = vector(x,y)
        self.mv = vector(0,0)

class gelatine:
    def __init__(self,a,b):
        self.a = a
        self.b = b
        self.distsq = Vdistsq(a.pos,b.pos)

#function
###############################################################

def correct(l,power=0.9):
    distsq = Vdistsq(l.a.pos, l.b.pos)
    delta = Vsub(l.a.pos, l.b.pos)
    if l.distsq != distsq:
        ratio = (l.distsq-distsq)/(2*l.distsq)
        ratio = ratio * power
        l.a.mv = Vadd(l.a.mv,VmulScale(delta,ratio))
        l.b.mv = Vadd(l.b.mv,VmulScale(delta,-ratio))

    
#test
###############################################################

if __name__ == "__main__":
    import pyg
    
    col1 = vector(0,512)
    col2 = vector(1024,385)
    origin = vector(1024,512)
    col3 = vector(0,256)
    col4 = vector(256,512)
    origin2 = vector(0,512)
    
    b = box(0,0,pyg.width,pyg.height)
    
    p = []
    p.append(pong(100,100))
    p.append(pong(100,200))
    p.append(pong(200,100))
    p.append(pong(200,200))
    
    l = []
    l.append(gelatine(p[0],p[1]))
    l.append(gelatine(p[1],p[2]))
    l.append(gelatine(p[2],p[0]))
    l.append(gelatine(p[3],p[2]))
    l.append(gelatine(p[3],p[1]))
    l.append(gelatine(p[3],p[0]))
    
    vertical = vector(0,1)
    horizontal = vector(1,0)
    
    while pyg.main():
        for i in p:
            i.mv.y += 0.5
            #collision detection
            #vertical
            dest = Vadd(i.pos,Vmul(i.mv,vertical))
            if (not collidePointLineSQ(dest,origin,col1,col2)) and VinBox(dest,b) and not collidePointLineSQ(dest,origin2,col3,col4):
                i.pos = dest
            else:
                i.mv = Vmul(i.mv,horizontal)
            #horizontal
            dest = Vadd(i.pos,Vmul(i.mv,horizontal))
            if (not collidePointLineSQ(dest,origin,col1,col2)) and VinBox(dest,b) and not collidePointLineSQ(dest,origin2,col3,col4):
                i.pos = dest
            else:
                i.mv = Vmul(i.mv,vertical)
            pyg.circle(i.pos.x,i.pos.y)

        for i in l:
            #correctJello(i,0.06)
            #jello power < 0.01
            #hard power ~ 0.9
            correct(i,0.618)
            
            pyg.line(i.a.pos.x, i.a.pos.y, i.b.pos.x, i.b.pos.y,(0,0,255))

        pyg.line(col1.x, col1.y, col2.x, col2.y,(255,0,0))
        pyg.line(col3.x, col3.y, col4.x, col4.y,(0,255,0))
