Skip to content

Create testdrive #59

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 61 additions & 8 deletions solar_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,26 @@
from solar_objects import Star, Planet


def translate_number_to_line_with_e(x):
"""Преобразует заданное число в строку с символом Е.

Параметры:

**x** — число, которое необходимо трансформировать в строку.
"""

log = 0
while x > 10:
x = x / 10
log = log + 1
x = str(x)
if len(x) > 4:
x = x[0] + x[1] + x[2] + x[3] + x[4] + 'E' + str(log)
else:
x = x + 'E' + str(log)
return x


def read_space_objects_data_from_file(input_filename):
"""Cчитывает данные о космических объектах из файла, создаёт сами объекты
и вызывает создание их графических образов
Expand All @@ -19,10 +39,14 @@ def read_space_objects_data_from_file(input_filename):
if len(line.strip()) == 0 or line[0] == '#':
continue # пустые строки и строки-комментарии пропускаем
object_type = line.split()[0].lower()
if object_type == "star": # FIXME: do the same for planet
if object_type == "star":
star = Star()
parse_star_parameters(line, star)
objects.append(star)
if object_type == "planet":
planet = Planet()
parse_star_parameters(line, planet)
objects.append(planet)
else:
print("Unknown space object")

Expand All @@ -36,15 +60,28 @@ def parse_star_parameters(line, star):

Здесь (x, y) — координаты зведы, (Vx, Vy) — скорость.
Пример строки:
Star 10 red 1000 1 2 3 4
Planet 10 red 1E3 1E0 2E0 3E0 4E0
Здесь число после Е обозначает спорядок величины

Параметры:

**line** — строка с описание звезды.
**star** — объект звезды.
"""

pass # FIXME: not done yet
star.R = int(line.split()[1])
star.color = line.split()[2]
m = line.split()[3]
star.m = float(m.split('E')[0]) * 10 ** int(m.split('E')[1])
x = line.split()[4]
star.x = float(x.split('E')[0]) * 10 ** int(x.split('E')[1])
y = line.split()[5]
star.y = float(y.split('E')[0]) * 10 ** int(y.split('E')[1])
Vx = line.split()[6]
star.Vx = float(Vx.split('E')[0]) * 10 ** int(Vx.split('E')[1])
Vy = line.split()[7]
star.Vy = float(Vy.split('E')[0]) * 10 ** int(Vy.split('E')[1])


def parse_planet_parameters(line, planet):
"""Считывает данные о планете из строки.
Expand All @@ -54,14 +91,27 @@ def parse_planet_parameters(line, planet):

Здесь (x, y) — координаты планеты, (Vx, Vy) — скорость.
Пример строки:
Planet 10 red 1000 1 2 3 4
Planet 10 red 1E3 1E0 2E0 3E0 4E0
Здесь число после Е обозначает спорядок величины

Параметры:

**line** — строка с описание планеты.
**planet** — объект планеты.
"""
pass # FIXME: not done yet...

planet.R = int(line.split()[1])
planet.color = line.split()[2]
m = line.split()[3]
planet.m = float(m.split('E')[0]) * 10 ** int(m.split('E')[1])
x = line.split()[4]
planet.x = float(x.split('E')[0]) * 10 ** int(x.split('E')[1])
y = line.split()[5]
planet.y = float(y.split('E')[0]) * 10 ** int(y.split('E')[1])
Vx = line.split()[6]
planet.Vx = float(Vx.split('E')[0]) * 10 ** int(Vx.split('E')[1])
Vy = line.split()[7]
planet.Vy = float(Vy.split('E')[0]) * 10 ** int(Vy.split('E')[1])


def write_space_objects_data_to_file(output_filename, space_objects):
Expand All @@ -77,10 +127,13 @@ def write_space_objects_data_to_file(output_filename, space_objects):
"""
with open(output_filename, 'w') as out_file:
for obj in space_objects:
print(out_file, "%s %d %s %f" % ('1', 2, '3', 4.5))
# FIXME: should store real values
m = translate_number_to_line_with_e(obj.m)
x = translate_number_to_line_with_e(obj.x)
y = translate_number_to_line_with_e(obj.y)
Vx = translate_number_to_line_with_e(obj.Vx)
Vy = translate_number_to_line_with_e(obj.Vy)
print(obj.type, obj.R, obj.color, m, x, y, Vx, Vy, file=out_file)

# FIXME: хорошо бы ещё сделать функцию, сохранающую статистику в заданный файл...

if __name__ == "__main__":
print("This module is not for direct call!")
12 changes: 7 additions & 5 deletions solar_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ def calculate_force(body, 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: нужно вывести формулу...
body.Fx = body.Fx + gravitational_constant*body.m*obj.m*(obj.x - body.x)/r**3
body.Fy = body.Fy + gravitational_constant*body.m*obj.m*(obj.y - body.y)/r**3


def move_space_object(body, dt):
Expand All @@ -32,9 +32,11 @@ def move_space_object(body, dt):
"""

ax = body.Fx/body.m
body.x += 42 # FIXME: не понимаю как менять...
body.Vx += ax*dt
# FIXME: not done recalculation of y coordinate!
body.x = body.x + body.Vx*dt
body.Vx = body.Vx + ax*dt
ay = body.Fy / body.m
body.y = body.x + body.Vy * dt
body.Vy = body.Vy + ay * dt


def recalculate_space_objects_positions(space_objects, dt):
Expand Down
18 changes: 9 additions & 9 deletions solar_system.txt
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
# Солнечная система
Star 2 red 1.98892E30 0 0 0 0
Star 2 red 1.98892E30 0E0 0E0 0E0 0E0

# Меркурий
Planet 2 orange 3.302E23 57.909E9 0 0 47.87E3
Planet 2 orange 3.302E23 57.909E9 0E0 0E0 47.87E3

# Венера
Planet 5 blue 4.869E24 108.21E9 0 0 35.02E3
Planet 5 blue 4.869E24 108.21E9 0E0 0E0 35.02E3

# Земля
Planet 5 green 5.974E24 149.60E9 0 0 29.76E3
Planet 5 green 5.974E24 149.60E9 0E0 0E0 29.76E3

#Марс
Planet 3 red 6.419E23 227.94E9 0 0 24.13E3
Planet 3 red 6.419E23 227.94E9 0E0 0E0 24.13E3

# Юпитер
Planet 20 yellow 1.899E27 778.41E9 0 0 13.07E3
Planet 20 yellow 1.899E27 778.41E9 0E0 0E0 13.07E3

# Сатурн
Planet 15 white 5.685E26 1429.4E9 0 0 9.67E3
Planet 15 white 5.685E26 1429.4E9 0E0 0E0 9.67E3

# Уран
#Planet 8 gray 8.685E25 2871.0E9 0 0 6.84E3
#Planet 8 gray 8.685E25 2871.0E9 0E0 0E0 6.84E3

# Нептун
#Planet 7 blue 1.024E26 4498.3E9 0 0 5.48E3
#Planet 7 blue 1.024E26 4498.3E9 0E0 0E0 5.48E3
3 changes: 3 additions & 0 deletions testdrive
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
this is testdrive

Now let's check, does it work from my laptop