Friday, April 15, 2016

Bermain dengan Gaya Sentral di Python.


 Merangkak dari kode sebelumnya, dengan tambahan kotak yang mengungkung bola-bola yang mengitari titik asal dengan berbagai kecepatan. Bola-bola tersebut tak bisa menembus kotak, jika menabrak salah satu dinding kotak, maka dia akan memantul


from visual import *
from random import uniform,random

l       = 17.
dl      = .01
display(center=(0,0,0),background=(1,1,1),autoscale=False, width=600, height=600,forward=(-0.7,-0.7,-1))
distant_light(direction=(1,1,1), color=color.red)

box(color=color.white, pos=(0,l/2,0),length=l,height=dl, width=l, opacity=0.3)
box(color=color.white, pos=(0,-l/2,0),length=l,height=dl, width=l, opacity=0.3)
box(color=color.white, pos=(l/2,0,0),length=dl,height=l, width=l, opacity=0.3)
box(color=color.white, pos=(-l/2,0,0),length=dl,height=l, width=l, opacity=0.3)
box(color=color.white, pos=(0,0,l/2),length=l,height=l, width=dl, opacity=0.3)

bola    = [] 
n       =   11

G       = 31.
for i in range(n):
    ball            = sphere (pos=(uniform(1,7),0,uniform(-7,7)), radius=.3, color=(random(),random(),random()))
    ball.v          = vector(0,uniform(1,3),0)
    
    bola.append(ball)


dt = 1./32.
bola[0].pos=(1,1,1)
while 1:
    rate (100)
    for i in arange(n):
        r           = bola[i].pos
        v           = bola[i].v
        jarak       = mag(bola[i].pos)
        arah        = -norm(bola[i].pos)
        gaya        = G*1./(pow(jarak,2)+.1)*arah
        a           = gaya
        v           += a*dt
        r           += v*dt
        #cek pantul ke tembok
        if bola[i].x > l/2.:
            bola[i].x   = l/2.
            v.x         *= -1
        elif bola[i].x < -l/2.:
            bola[i].x   = -l/2.
            v.x         *= -1
        elif bola[i].y > l/2.:
            bola[i].y   = l/2.
            v.y         *= -1
        if bola[i].y < -l/2.:
            bola[i].y   = -l/2.
            v.y         *= -1
        if bola[i].z > l/2.:
            bola[i].z   = l/2.
            v.z         *= -1
        if bola[i].z < -l/2.:
            bola[i].z   = -l/2.
            v.z         *= -1

        bola[i].pos = r
        

.