Sunday, May 29, 2016

Bouncing Ball inside a Cone


  I use vector projection and rejection to calculate velocity after bouncing the side of cone, :)





#code
from visual import *
from random import uniform

display(center=(0,2,0),background=(1,1,1), autoscale=False, range=4.5,        
        width=600, height=600,  forward=(-.4,-.3,-1)) #arah kamera

distant_light(direction=(1,1,1), color=color.red)

Cone        = cone(pos = (0,0,0), axis=(0,5,0), radius = 3, opacity = .2) 


bola        = sphere(color=color.green,radius=.2)
bola.y      = 1
bola.x      = -1
bola.z      = 1

v           = vector(1,-1,0)
dt          = 1./16
r           = bola.pos
rc          = Cone.radius
h           = vector(Cone.axis)

def pantul():
    global r,v
    #tumbukan dengan lantai
    if r.y<0:
        r.y = 0
        v.y *= -1

    rp      = vector(r.x,0,r.z)
    hb      = h.y - r.y
    rmaks   = hb/h.y*rc
    c       = h-rmaks*norm(rp)    #vektor garis singgung 
                                  #selimut kerucut dengan bidang singgung
    #tumbukan dengan selimut kerucut
    if mag(rp)>rmaks:
        rp  = norm(rp)*rmaks
        r   = vector(rp.x,r.y,rp.z)
        vp  = dot(v,norm(c))*norm(c)
        v   = 2*vp-v
    print v



def proses():
    global r,v
    a   = vector(0,0,0)
    v   += a*dt
    r   += v*dt

    bola.pos  = r

    pantul()

while 1:
    rate(37)
    proses()

.