forked from mipt-cs/2016-solar_project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
solar_model.py
55 lines (43 loc) · 2.12 KB
/
solar_model.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
# coding: utf-8
# license: GPLv3
gravitational_constant = 6.67408E-11
"""Гравитационная постоянная Ньютона G"""
def calculate_force(body, space_objects):
"""Вычисляет силу, действующую на тело.
Параметры:
**body** — тело, для которого нужно вычислить дейстующую силу.
**space_objects** — список объектов, которые воздействуют на тело.
"""
body.Fx = body.Fy = 0
for obj in space_objects:
if body == obj:
continue # тело не действует гравитационной силой на само себя!
r = ((body.x - obj.x) ** 2 + (body.y - obj.y) ** 2) ** 0.5
r = max(r, body.R + obj.R) # обработка аномалий при прохождении одного тела сквозь другое
body.Fx += -gravitational_constant * obj.m * body.m * (body.x - obj.x) / r ** 3
body.Fy += -gravitational_constant * obj.m * body.m * (body.y - obj.y) / r ** 3
def move_space_object(body, dt):
"""Перемещает тело в соответствии с действующей на него силой.
Параметры:
**body** — тело, которое нужно переместить.
"""
old = body.x
ax = body.Fx / body.m
body.x += body.Vx * dt + ax * dt ** 2 / 2
body.Vx += ax * dt
ay = body.Fy / body.m
body.y += body.Vy * dt + ay * dt ** 2 / 2
body.Vy += ay * dt
def recalculate_space_objects_positions(space_objects, dt):
"""Пересчитывает координаты объектов.
Параметры:
**space_objects** — список оьъектов, для которых нужно пересчитать координаты.
**dt** — шаг по времени
:rtype: object
"""
for body in space_objects:
calculate_force(body, space_objects)
for body in space_objects:
move_space_object(body, dt)
if __name__ == "__main__":
print("This module is not for direct call!")