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

Создать бесплатный сайт с uCoz