Скрипт моделирует упругое взаимодействие частиц разной массы.
Разрешение дисплея смартфона-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)
|