Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- dim = 2
- alpha=0.9 #модуль юнга на сжатие
- dalpha=0.1
- dt = 1
- g = 1
- class vect:
- def __init__ (self, x, y, dim):
- self.x = []
- self.x.append (x)
- self.x.append (y)
- self.dim = dim
- def smult (self, v): #скалярно умножть
- r = 0
- for i in range (self.dim):
- r += self.x[i] * v.x[i]
- return r
- def __getitem__ (self, i):
- return self.x[i]
- def __setitem__ (self, i, val):
- self.x[i] = val
- def __mul__ (self, s):
- r = vect (self[0], self[1], self.dim)
- for i in range (r.dim):
- r[i] = r[i] * s
- return r
- def __add__ (self, v):
- r = vect(self[0], self[1], self.dim)
- for i in range (r.dim):
- r[i] = r[i] + v[i]
- return r
- class sphere:
- def __init__ (self, x, y, r, m, idnt):
- self.x = vect (x, y, dim)
- self.v = vect (0, 0, dim)
- self.a = vect (0, 0, dim)
- self.r = r
- self.m = m
- self.idnt = idnt
- def distancy(self,b):
- r = 0 #расстояние между шариками
- for i in range (dim):
- r += (self.x[i]-b.x[i])**2
- return r ** 0.5
- def is_gettin_closer(self,b): #сближаются ли шарики
- g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
- sosi=g.smult(self.v)-g.smult(b.v)
- return (sosi>0)
- def force (self, b): #функция силы
- r = vect (0, 0, dim)
- g=vect((self.x[0]-b.x[0])/self.distancy(b),(self.x[1]-b.x[1])/self.distancy(b),dim)
- if(self.distancy(b)>self.r+b.r):
- return 0
- f=self.r+b.r-self.distancy(b)
- f=f*(alpha+self.is_gettin_closer(b)*dalpha)
- r[0]=g[0]*f
- r[1]=g[1]*f
- return r
- ss = []
- for i in range (10):
- ss.append(sphere(0, i * 3 + 1, 1, 1, i))
- for i in ss:
- print (i.x[1])
- while (True):
- for i in ss: #сброс ускорений и учет силы тяжести
- i.a[0] = 0
- i.a[1] = -g
- for i in ss: #начало обработки взаимодействий
- if i.x[1] - i.r < 0: #взаимодействие с землей
- if (i.v[1] < 0 or (i.v[1] == 0 and i.a[1] < 0)):
- i.a[1] += (alpha + dalpha) * (i.r - i.x[1])
- else:
- i.a[1] += alpha * (i.r - i.x[1])
- for j in ss: #взаимодействие с другими шариками
- if i.idnt == j.idnt: #сам с собой не взаимодействует
- continue
- f = force (i, j) #функция, определяющая силу, с которой шарик j воздействует на шарик i
- i.a = i.a + f * (1 / i.m) #конец обработки взаимодействий
- for i in ss: #обработка перемещений и изменения скоростей
- for z in range (dim):
- i.x[z] += i.v[z]*dt + 0.5 * dt * dt * i.a[z]
- i.v[z] += i.a[z]
- break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement