This repository has been archived by the owner on Apr 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBody.py
82 lines (72 loc) · 2.18 KB
/
Body.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import numpy as np
gBodies = []
class Body:
def __init__(self, id_st, m, r_x, r_y, r_z, v_x, v_y, v_z, color, lum_state):
self.id = id_st
self.mass = m
self.r_x = r_x
self.r_y = r_y
self.r_z = r_z
self.v_x = v_x
self.v_y = v_y
self.v_z = v_z
self.color = color
self.light = lum_state
self.prepareNumpy()
def prepareNumpy(self):
# Preparando los vectores de operacion n_bodies para manipularlos con numpy
self.r = []
self.r.append(self.r_x)
self.r.append(self.r_y)
self.r.append(self.r_z)
self.r = np.array(self.r)
self.v = []
self.v.append(self.v_x)
self.v.append(self.v_y)
self.v.append(self.v_z)
self.v = np.array(self.v)
def refreshInteraction(bodies_arr):
global gBodies
new_gBodies = []
for b in bodies_arr:
temp_body = b
temp_body = Body.recalcBody(temp_body, b, bodies_arr)
new_gBodies.append(temp_body)
Body.applyColissions(temp_body)
gBodies = new_gBodies
def recalcBody(contenier, principal_body, interacting_bodies):
dt = 5000
G = 6.674e-11 # Constante de gravitacion universal
a = np.array([.0,.0,.0]) # Aceleracion a acumular por cada cuerpo interactuando
for b in interacting_bodies: # Para cada cuerpo en gBodies
if b.id != principal_body.id: # Diferente al manipulado
d = b.r - principal_body.r # r_j - r vector distancia entre vectores posicion
a += d*((G*b.mass)/(np.linalg.norm(d)**3)) # Ecuacion de gravitacion universal (vectorial)
# Actualizar parametros de temp_body
contenier.v += a*dt
contenier.r += contenier.v*dt
return contenier
def applyColissions(body):
global gBodies
for b in gBodies:
if b != body:
if np.linalg.norm(body.r - b.r) < 200:
if np.sign(body.v[0]) != np.sign(b.v[0]):
body.v[0] = -body.v[0]
b.v[0] = -b.v[0]
if np.sign(body.v[1]) != np.sign(b.v[1]):
body.v[1] = -body.v[1]
b.v[1] = -b.v[1]
if np.sign(body.v[2]) != np.sign(b.v[2]):
body.v[2] = -body.v[2]
b.v[2] = -b.v[2]
if np.linalg.norm(body.r - b.r) < 170:
print("!")
b.r += (b.r-body.r)*.05
body.r += (body.r-b.r)*.05
break
def main():
b = Body("b1", 13, 1,2,-1,0,3,4, (0.5,0.2,0.45))
print(b.v)
if __name__ == "__main__":
main()