forked from mipt-cs/2016-solar_project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolar_model.py
56 lines (38 loc) · 1.89 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
56
# 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
body.Fx += 1 # FIXME: нужно вывести формулу...
body.Fy += 2 # FIXME: нужно вывести формулу...
def move_space_object(body, dt):
"""Перемещает тело в соответствии с действующей на него силой.
Параметры:
**body** — тело, которое нужно переместить.
"""
ax = body.Fx/body.m
body.x += 42 # FIXME: не понимаю как менять...
body.Vx += ax*dt
# FIXME: not done recalculation of y coordinate!
def recalculate_space_objects_positions(space_objects, dt):
"""Пересчитывает координаты объектов.
Параметры:
**space_objects** — список оьъектов, для которых нужно пересчитать координаты.
**dt** — шаг по времени
"""
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!")