daily pastebin goal
69%
SHARE
TWEET

Untitled

a guest Oct 19th, 2018 76 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. dim = 2
  2. alpha=0.9                                                                        #модуль юнга на сжатие
  3. dalpha=0.1
  4. dt = 1
  5. g = 1
  6.  
  7. class vect:
  8.     def __init__ (self, x, y, dim):
  9.         self.x = []
  10.         self.x.append (x)
  11.         self.x.append (y)
  12.         self.dim = dim
  13.        
  14.     def smult  (self, v):                                                      #скалярно умножть
  15.         r = 0
  16.         for i in range (self.dim):
  17.             r += self.x[i] * v.x[i]
  18.         return r
  19.    
  20.     def __getitem__ (self, i):
  21.         return self.x[i]
  22.    
  23.     def __setitem__ (self, i, val):
  24.         self.x[i] = val
  25.        
  26.     def __mul__ (self, s):
  27.         r = vect (self[0], self[1], self.dim)
  28.         for i in range (r.dim):
  29.             r[i] = r[i] * s
  30.         return r
  31.            
  32.     def __add__ (self, v):
  33.         r = vect(self[0], self[1], self.dim)
  34.         for i in range (r.dim):
  35.             r[i] = r[i] + v[i]
  36.         return r
  37.  
  38. class sphere:
  39.     def __init__ (self, x, y, r, m, idnt):
  40.         self.x = vect (x, y, dim)
  41.         self.v = vect (0, 0, dim)
  42.         self.a = vect (0, 0, dim)
  43.         self.r = r
  44.         self.m = m
  45.         self.idnt = idnt
  46.         def distancy(self,b):
  47.             r = 0                                                             #расстояние  между шариками
  48.             for i in range (dim):
  49.                 r += (self.x[i]-b.x[i])**2
  50.             return r ** 0.5
  51.         def is_gettin_closer(self,b):                                                     #сближаются ли шарики
  52.             g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
  53.             sosi=g.smult(self.v)-g.smult(b.v)
  54.             return (sosi>0)
  55.         def force (self, b):                                                              #функция силы
  56.             r = vect (0, 0, dim)
  57.             g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
  58.             if(self.distancy(b)>self.r+b.r):
  59.                 return 0
  60.             f=self.r+b.r-self.distancy(b)
  61.             f=f*(alpha+self.is_gettin_closer(b)*dalpha)
  62.             r[0]=g[0]*f
  63.             r[1]=g[1]*f
  64.             return r
  65.  
  66. ss = []
  67. for i in range (10):
  68.     ss.append(sphere(0, i * 3 + 1, 1, 1, i))
  69. for i in ss:
  70.     print (i.x[1])
  71.  
  72. while (True):
  73.     for i in ss:                                                               #сброс ускорений и учет силы тяжести
  74.         i.a[0] = 0
  75.         i.a[1] = -g
  76.        
  77.     for i in ss:                                                               #начало обработки взаимодействий
  78.         if i.x[1] - i.r < 0:                                                   #взаимодействие с землей    
  79.             if (i.v[1] < 0 or (i.v[1] == 0 and i.a[1] < 0)):
  80.                 i.a[1] += (alpha + dalpha) * (i.r - i.x[1])
  81.             else:
  82.                 i.a[1] += alpha * (i.r - i.x[1])
  83.        
  84.         for j in ss:                                                           #взаимодействие с другими шариками
  85.             if i.idnt == j.idnt:                                               #сам с собой не взаимодействует
  86.                 continue
  87.             f = force (i, j)                                                   #функция, определяющая силу, с которой шарик j воздействует на шарик i
  88.             i.a = i.a + f * (1 / i.m)                                               #конец обработки взаимодействий
  89.                    
  90.     for i in ss:                                                               #обработка перемещений и изменения скоростей
  91.         for z in range (dim):
  92.             i.x[z] += i.v[z]*dt + 0.5 * dt * dt * i.a[z]
  93.             i.v[z] += i.a[z]
  94.     break
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top