Идеальный газ Печать
Автор: Administrator   
13.04.2011 12:36

Скрипт моделирует упругое взаимодействие частиц разной массы.

Разрешение дисплея смартфона-240x320 pixels.

 

 

import appuifw,e32
from key_codes import*
from random import choice
from math import hypot

appuifw.app.screen='full'
c=appuifw.Canvas()
appuifw.app.body=c
c.clear(0x000000)

class M:
def __init__(self,x,y,u,v,r):
self.x,self.y=x,y
self.u,self.v=u,v
self.c,self.r=c,r
def dryak(self):
self.c.ellipse((self.x-self.r,\
self.y-self.r,self.x+self.r,self.y+\
self.r),fill=0xff0000)

X,Y,U,V,Un,Ut,R=[],[],[],[],[],[],[]
for i in range(21):
X.append(choice(range(15,215)))
Y.append(choice(range(15,305)))
U.append(choice(range(1,9)))
V.append(choice(range(1,9)))
R.append(choice(range(7,27)))

while True:
for i in range(21):
for j in range(21):
if j>i:
a,b=X[j]-X[i],Y[j]-Y[i]
d=hypot(a,b)
if d<=R[i]+R[j]:
Uni=(U[i]*a+V[i]*b)/d
Uti=(V[i]*a-U[i]*b)/d
Unj=(U[j]*a+V[j]*b)/d
Utj=(V[j]*a-U[j]*b)/d
mi,mj=R[i]**2,R[j]**2
u0=(2*mj*Unj+mi*Uni-mj*\
Uni)/(mi+mj)
u1=(2*mi*Uni+mj*Unj-mi*\
Unj)/(mi+mj)
Uni,Unj=u0,u1
U[i]=(a*Uni-b*Uti)/d
V[i]=(a*Uti+b*Uni)/d
U[j]=(a*Unj-b*Utj)/d
V[j]=(a*Utj+b*Unj)/d
X[i]+=U[i]
Y[i]+=V[i]
X[j]+=U[j]
Y[j]+=V[j]

for i in range(21):
if X[i]-R[i]<=0 or X[i]+R[i]>=\
240:
U[i]=-U[i]
if Y[i]-R[i]<=0 or Y[i]+R[i]>=\
320:
V[i]=-V[i]
X[i]+=U[i]
Y[i]+=V[i]
for i in range(21):
M(X[i],Y[i],U[i],V[i],R[i]).dryak()
e32.ao_sleep(0.0001)
c.clear(0x000000)


( 2 Votes )
Обновлено 25.04.2011 15:42