Saturday, April 16, 2016

Menjinakkan Gravitasi.


 Cari cara agar mereka jadi enak untuk dilihat.

 Di kode sebelumnya, bola sudah dicegah agar tidak melarikan diri dengan menambahkan kotak, mereka akan memantul jika menabrak kotak.

 Beres, sekarang tambahkan interaksi antar bola, interaksi sederhana, gravitasi.

 Ok, pake metode brutal, untuk tiap-tiap bola, hitung satu-satu interaksi gravitasi dengan seluruh bola, kemudian jumlahkan.





(ide, cari pusat masa seluruh bola, perlakukan interaksi gaya seperti kode sebelumnya)

 (saat nulis tadi, sambil mikir, ternyata itu ide buruk, tapi boleh juga, lihat saja nanti, bagus atau tidak)

 (tapi tidak sekarang, tidak masuk kode yang sekarang)

 (kode di posting ini tetap pake metode brutal)

 Hasilnya adalah, ..., ok, mereka tetap memantul saat menabrak tembok, tetapi di dalam kotak mereka bergerak dengan sangat cepat, bola liar.

 (yep, metode brutal menghasilkan hasil brutal, tetapi tidak selalu...)

 Ide licik, tambahkan koefisien restitusi di dinding, tumbukan dengan dinding tidak lenting sempurna, kecepatannya tinggal 10% setelah memantul

 Dengan demikian mereka lebih jinak di dalam kotak, :)
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)
#local_light(pos=(0,0,0), color=(0,0,1))
#sphere(pos=(0,0,0), color=(0,0,0), material=materials.emissive, opacity=0.9)

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
dv      = .1        #kecepatan setelah menabrak dinding
G       = 31.
for i in range(n):
    ball            = sphere (pos=(uniform(-7,7),uniform(-7,7),uniform(-7,7)), radius=.3, color=(random(),random(),random()))
    ball.v          = vector(uniform(-1,1),uniform(-1,1),uniform(-1,1))
    
    bola.append(ball)


dt = 1./32.
bola[0].pos=(1,1,1)


def hitungGaya(i):
    gaya    = vector(0,0,0)
    for j in arange(n):
        if i!=j:  
            r           = bola[i].pos-bola[j].pos
            jarak       = mag(r)
            arah        = -norm(r)
            gaya        += G*1./(pow(jarak,2)+.1)*arah
    return gaya
def proses():
    global bola
    for i in arange(n):
        gaya        = hitungGaya(i)
        #tambah gaya dari pusat
        r           = bola[i].pos
        jarak       = mag(bola[i].pos)
        arah        = -norm(bola[i].pos)
        gaya        += 10*G*1./(pow(jarak,2)+.05)*arah

        a           = gaya
        v           = bola[i].v
        v           += a*dt
        r           += v*dt
        #cek pantul ke tembok
        if bola[i].x > l/2.:
            bola[i].x   = l/2.
            v.x         *= -dv
        elif bola[i].x < -l/2.:
            bola[i].x   = -l/2.
            v.x         *= -dv
        elif bola[i].y > l/2.:
            bola[i].y   = l/2.
            v.y         *= -dv
        if bola[i].y < -l/2.:
            bola[i].y   = -l/2.
            v.y         *= -dv
        if bola[i].z > l/2.:
            bola[i].z   = l/2.
            v.z         *= -dv
        if bola[i].z < -l/2.:
            bola[i].z   = -l/2.
            v.z         *= -dv

        bola[i].pos = r
        
while 1:
    rate (10)
    proses()


.