Pada program phyton saya sebelumya keterangan pada perintah-perintahnya belum jelas. Nah di sini penjelasannya. Hal yang bisa ditangkap di sini adalah:

  1. Python mendukung penulisan variabel berbentuk vektor.
  2. Python mendukung operasi vektor (penormalan, besar vektor, penjumlahan, perkalian dot)

Kode:
from visual import * #agar dapat menggunakan obyek tiga dimensi
from random import uniform #agar dapat menggunakan random jenis uniform
from visual.graph import * #agar dapat membuat grafik/tabel

scene.x=800 #ukuran jendela

#buat tembok
thk = 0.1 #ketebalan
side = 7.0 #lebar
s2 = 2*side - thk
s3 = 2*side + thk
#wallR=tembok kanan; wallL=tembok kiri; ...dst
#box(...) artinya tembok yang kita buat berupa kotak dengan posisi (x,y,z), panjang length #...

wallR = box (pos=vector( side, 0, 0), length=thk, height=s2, width=s3, color = color.red)
wallL = box (pos=vector(-side, 0, 0), length=thk, height=s2, width=s3, color = color.red)
wallB = box (pos=vector(0, -side, 0), length=s3, height=thk, width=s3, color = color.blue)
wallT = box (pos=vector(0, side, 0), length=s3, height=thk, width=s3, color = color.blue)
wallBK = box(pos=vector(0, 0, -side), length=s2, height=s2, width=thk, color = (0.7,0.7,0.7))

##########################################
# Buat Bola
##########################################
no_particles=37 #jumlah bola yang akan dibuat
ball_radius=1. #radius bola
maxpos=side-.5*thk-ball_radius #posisi maksimum letak bola yang dibolehkan
maxv=7.0 #kecepatan maksimum bola

'''

Keterangan :

  • ball_list=[] adalah perintah membuat list (semacam array di delphi) bernama ball_list, berfungsi untuk menampung objek bernama ball yang terbuat dari object bernama sphere.
  • Perintah di bawah adalah untuk mengulang pembuatan bola sebanyak no_particles kali, ingat setelah perintah for, harus menjorok ke dalam, hal ini semacam begin di delphi.
'''
ball_list=[]
for i in arange(no_particles):
jari =ball_radius
ball=sphere(color=color.green,radius=jari)
ball.pos=maxpos*vector(uniform(-1,1),uniform(-1,1),uniform(-1,1))
ball.velocity=maxv*vector(uniform(-1,1),uniform(-1,1),uniform(-1,1))
ball_list.append(ball) #perintah ini memasukkan bola ke dalam ball_list

#perhatikan bahwa posisi dan kecepatan berupa vektor (x,y,z) dan (vx,vy,vz)
###########################################
# Setup Histogram Plot/buat grafik
###########################################
graphwindow=gdisplay(xtitle='v',ytitle='N',ymax=no_particles/2)
velocity_dist=ghistogram(bins=arange(0,2*maxv,maxv/5),accumulate=1,average=1)
expected_distribution=gcurve(color=color.green)
for vx in arange(0,2*maxv,maxv/20):
expected_distribution.plot(pos = (vx,.27*no_particles*exp(-vx**2/maxv**2*3/2)))

##########################################
# Time loop for moving Ball(s)
###########################################
timestep = 0.05
while (1==1):
rate(100) #artinya setiap detik jangan lakukan lebih dari 100 kali
######################################
# Loop over list of particles
# Move and check wall collisions
######################################
for ball in ball_list:
suhu=mag(ball.velocity)/maxv #suhu bola sebanding dengan kecepatannya
ball.color=(suhu/2,1-suhu/2,0) #warna bola sebanding dengan suhunya
ball.pos = ball.pos + ball.velocity*timestep #gerakkan bola sejauh dr
#check right wall collisions
if ball.x > maxpos:
#reflect velocity/ balik kecepatannya
ball.velocity.x = -ball.velocity.x
#reflect position/ pantulkan sedikit
ball.x=2*maxpos-ball.x
#left wall
if ball.x < -maxpos:
ball.velocity.x = -ball.velocity.x
ball.x=-2*maxpos-ball.x
# roof
if ball.y > maxpos:
ball.velocity.y = -ball.velocity.y
ball.y=2*maxpos-ball.y
#floor
if ball.y < -maxpos:
ball.velocity.y = -ball.velocity.y
ball.y=-2*maxpos-ball.y
#back wall
if ball.z > maxpos:
ball.velocity.z = -ball.velocity.z
ball.z=2*maxpos-ball.z
#front wall
if ball.z < -maxpos:
ball.velocity.z = -ball.velocity.z
ball.z=-2*maxpos-ball.z

######################################
# Ball Collision Detection
######################################
# hitung tumbukan setiap pasangan
for i in range(no_particles):
for j in range(i+1,no_particles):
distance=mag(ball_list[i].pos-ball_list[j].pos) #hitung besar vektor jarak keduanya
#check collision
if distance<(ball_list[i].radius+ball_list[j].radius):
#unit vector in collision direction/ tentukan vektor normal
direction=norm(ball_list[j].pos-ball_list[i].pos)
vi=dot(ball_list[i].velocity,direction)# arah vektor kecepatan permukaan kontak
vj=dot(ball_list[j].velocity,direction)
#impact velocity
exchange=vj-vi #kecepatan yang dipertukarkan
##exchange momentum/pertukaran momentum
ball_list[i].velocity=ball_list[i].velocity + exchange*direction
ball_list[j].velocity=ball_list[j].velocity - exchange*direction
##adjust position/pantulkan
overlap=ball_list[i].radius+ball_list[j].radius-distance
ball_list[i].pos=ball_list[i].pos - overlap*direction
ball_list[j].pos=ball_list[j].pos + overlap*direction

#######################################
# Plot the x velocity histogram
#######################################
v_list=[]
for ball in ball_list:
v_list.append(mag(ball.velocity))
velocity_dist.plot(data=v_list)

 

 

 

Loading