Skip to content

Пробный запрос. #53

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
25 changes: 15 additions & 10 deletions solar_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,19 @@ 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
star = Star()
parse_star_parameters(line, star)
if object_type == "star":
star = parse_star_parameters(line)
objects.append(star)
elif object_type == "planet":
planet = parse_planet_parameters(line)
objects.append(planet)
else:
print("Unknown space object")

return objects


def parse_star_parameters(line, star):
def parse_star_parameters(line):
"""Считывает данные о звезде из строки.
Входная строка должна иметь слеюущий формат:
Star <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy>
Expand All @@ -43,10 +45,11 @@ def parse_star_parameters(line, star):
**line** — строка с описание звезды.
**star** — объект звезды.
"""
line = line.split()
line[0] = line[0].lower()
return Star(line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7])

pass # FIXME: not done yet

def parse_planet_parameters(line, planet):
def parse_planet_parameters(line):
"""Считывает данные о планете из строки.
Предполагается такая строка:
Входная строка должна иметь слеюущий формат:
Expand All @@ -61,7 +64,9 @@ def parse_planet_parameters(line, planet):
**line** — строка с описание планеты.
**planet** — объект планеты.
"""
pass # FIXME: not done yet...
line = line.split()
line[0] = line[0].lower()
return Planet(line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7])


def write_space_objects_data_to_file(output_filename, space_objects):
Expand All @@ -77,8 +82,8 @@ 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
print(out_file, obj.type, obj.R, obj.color,
obj.m, obj.x, obj.y, obj.Vx, obj.Vy)

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

Expand Down
3 changes: 1 addition & 2 deletions solar_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"""Отображаемое на экране время.
Тип: переменная tkinter"""

time_step = None
time_step = 0
"""Шаг по времени при моделировании.
Тип: float"""

Expand Down Expand Up @@ -82,7 +82,6 @@ def open_file_dialog():
space_objects = read_space_objects_data_from_file(in_filename)
max_distance = max([max(abs(obj.x), abs(obj.y)) for obj in space_objects])
calculate_scale_factor(max_distance)

for obj in space_objects:
if obj.type == 'star':
create_star_image(space, obj)
Expand Down
20 changes: 8 additions & 12 deletions solar_model.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
# coding: utf-8
# license: GPLv3

gravitational_constant = 6.67408E-11
G = 6.76408E-11
"""Гравитационная постоянная Ньютона G"""


def calculate_force(body, space_objects):
"""Вычисляет силу, действующую на тело.

Параметры:

**body** — тело, для которого нужно вычислить дейстующую силу.
**space_objects** — список объектов, которые воздействуют на тело.
"""
Expand All @@ -19,29 +17,27 @@ 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: нужно вывести формулу...

F = G*body.m*obj.m/r**2
body.Fx += F*(obj.x - body.x)/r
body.Fy += F*(obj.y - body.y)/r

def move_space_object(body, dt):
"""Перемещает тело в соответствии с действующей на него силой.

Параметры:

**body** — тело, которое нужно переместить.
"""

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


def recalculate_space_objects_positions(space_objects, dt):
"""Пересчитывает координаты объектов.

Параметры:

**space_objects** — список оьъектов, для которых нужно пересчитать координаты.
**dt** — шаг по времени
"""
Expand Down
94 changes: 47 additions & 47 deletions solar_objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,78 +5,78 @@
class Star:
"""Тип данных, описывающий звезду.
Содержит массу, координаты, скорость звезды,
а также визуальный радиус звезды в пикселах и её цвет.
а также визуальный радиус звезды в пикселях и её цвет.
"""
def __init__(self, type, R, color, m, x, y, velocity_x, velocity_y):
self.type = type
"""Признак объекта звезды"""

type = "star"
"""Признак объекта звезды"""
self.R = float(R)
"""Радиус звезды"""

m = 0
"""Масса звезды"""
self.m = float(m)
"""Масса звезды"""

x = 0
"""Координата по оси **x**"""
self.x = float(x)
"""Координата по оси **x**"""

y = 0
"""Координата по оси **y**"""
self.y = float(y)
"""Координата по оси **y**"""

Vx = 0
"""Скорость по оси **x**"""
self.Vx = float(velocity_x)
"""Скорость по оси **x**"""

Vy = 0
"""Скорость по оси **y**"""
self.Vy = float(velocity_y)
"""Скорость по оси **y**"""

Fx = 0
"""Сила по оси **x**"""
self.Fx = 0
"""Сила по оси **x**"""

Fy = 0
"""Сила по оси **y**"""
self.Fy = 0
"""Сила по оси **y**"""

R = 5
"""Радиус звезды"""
self.color = color
"""Цвет звезды"""

color = "red"
"""Цвет звезды"""

image = None
"""Изображение звезды"""
self.image = None
"""Изображение звезды"""


class Planet:
"""Тип данных, описывающий планету.
Содержит массу, координаты, скорость планеты,
а также визуальный радиус планеты в пикселах и её цвет
"""
def __init__(self, type, R, color, m, x, y, velocity_x, velocity_y):
self.type = type
"""Признак объекта звезды"""

type = "planet"
"""Признак объекта планеты"""

m = 0
"""Масса планеты"""
self.m = float(m)
"""Масса звезды"""

x = 0
"""Координата по оси **x**"""
self.x = float(x)
"""Координата по оси **x**"""

y = 0
"""Координата по оси **y**"""
self.y = float(y)
"""Координата по оси **y**"""

Vx = 0
"""Скорость по оси **x**"""
self.Vx = float(velocity_x)
"""Скорость по оси **x**"""

Vy = 0
"""Скорость по оси **y**"""
self.Vy = float(velocity_y)
"""Скорость по оси **y**"""

Fx = 0
"""Сила по оси **x**"""
self.Fx = 0
"""Сила по оси **x**"""

Fy = 0
"""Сила по оси **y**"""
self.Fy = 0
"""Сила по оси **y**"""

R = 5
"""Радиус планеты"""
self.R = float(R)
"""Радиус звезды"""

color = "green"
"""Цвет планеты"""
self.color = color
"""Цвет звезды"""

image = None
"""Изображение планеты"""
self.image = None
"""Изображение звезды"""
6 changes: 3 additions & 3 deletions solar_system.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Planet 5 blue 4.869E24 108.21E9 0 0 35.02E3
# Земля
Planet 5 green 5.974E24 149.60E9 0 0 29.76E3

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

# Юпитер
Expand All @@ -20,7 +20,7 @@ Planet 20 yellow 1.899E27 778.41E9 0 0 13.07E3
Planet 15 white 5.685E26 1429.4E9 0 0 9.67E3

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

# Нептун
#Planet 7 blue 1.024E26 4498.3E9 0 0 5.48E3
Planet 7 blue 1.024E26 4498.3E9 0 0 5.48E3
10 changes: 7 additions & 3 deletions solar_vis.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

"""Модуль визуализации.
Нигде, кроме этого модуля, не используются экранные координаты объектов.
Функции, создающие гaрафические объекты и перемещающие их на экране, принимают физические координаты
Функции, создающие графические объекты и перемещающие их на экране, принимают физические координаты
"""

header_font = "Arial-16"
Expand Down Expand Up @@ -54,7 +54,7 @@ def scale_y(y):
**y** — y-координата модели.
"""

return y # FIXME: not done yet
return int((-y)*scale_factor) + window_height//2


def create_star_image(space, star):
Expand All @@ -80,7 +80,11 @@ def create_planet_image(space, planet):
**space** — холст для рисования.
**planet** — объект планеты.
"""
pass # FIXME: сделать как у звезды

x = scale_x(planet.x)
y = scale_y(planet.y)
r = planet.R
planet.image = space.create_oval([x - r, y - r], [x + r, y + r], fill=planet.color)


def update_system_name(space, system_name):
Expand Down