From a0414ba529f524b0940ab54679cd589bd7ca0ebe Mon Sep 17 00:00:00 2001 From: DropName <55547028+DropName@users.noreply.github.com> Date: Thu, 21 Nov 2019 01:11:43 +0300 Subject: [PATCH 1/9] Fixed scale_y and create_planet_image --- solar_vis.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/solar_vis.py b/solar_vis.py index ae972ba4..8016c457 100644 --- a/solar_vis.py +++ b/solar_vis.py @@ -24,7 +24,7 @@ def calculate_scale_factor(max_distance): """Вычисляет значение глобальной переменной **scale_factor** по данной характерной длине""" global scale_factor - scale_factor = 0.4*min(window_height, window_width)/max_distance + scale_factor = 0.4 * min(window_height, window_width) / max_distance print('Scale factor:', scale_factor) @@ -39,7 +39,7 @@ def scale_x(x): **x** — x-координата модели. """ - return int(x*scale_factor) + window_width//2 + return int(x * scale_factor) + window_width // 2 def scale_y(y): @@ -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): @@ -65,11 +65,11 @@ def create_star_image(space, star): **space** — холст для рисования. **star** — объект звезды. """ - x = scale_x(star.x) y = scale_y(star.y) r = star.R - star.image = space.create_oval([x - r, y - r], [x + r, y + r], fill=star.color) + star.image = space.create_oval( + [x - r, y - r], [x + r, y + r], fill=star.color) def create_planet_image(space, planet): @@ -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 = planet.create_oval( + [x - r, y - r], [x + r, y + r], fill=planet.color) def update_system_name(space, system_name): @@ -108,7 +112,7 @@ def update_object_position(space, body): r = body.R if x + r < 0 or x - r > window_width or y + r < 0 or y - r > window_height: space.coords(body.image, window_width + r, window_height + r, - window_width + 2*r, window_height + 2*r) # положить за пределы окна + window_width + 2 * r, window_height + 2 * r) # положить за пределы окна space.coords(body.image, x - r, y - r, x + r, y + r) From 1604e946106fbca2e8a2d380356853ff5f18f939 Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 01:19:55 +0300 Subject: [PATCH 2/9] Update solar_input.py --- solar_input.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solar_input.py b/solar_input.py index d45e0401..a6b14ff1 100644 --- a/solar_input.py +++ b/solar_input.py @@ -29,7 +29,7 @@ def read_space_objects_data_from_file(input_filename): return objects -def parse_star_parameters(line, star): +def parse_star_parameters(line): """Считывает данные о звезде из строки. Входная строка должна иметь слеюущий формат: Star <радиус в пикселах> <цвет> <масса> @@ -44,7 +44,7 @@ def parse_star_parameters(line, star): **star** — объект звезды. """ - pass # FIXME: not done yet + return Star(line[0], line[1], line[2], line[3], line[4], line[5], line[6], line[7]) def parse_planet_parameters(line, planet): """Считывает данные о планете из строки. @@ -61,7 +61,7 @@ def parse_planet_parameters(line, planet): **line** — строка с описание планеты. **planet** — объект планеты. """ - pass # FIXME: not done yet... + 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): From a966ca5559db6deb7e548451d21abc7e8ecbfdfb Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 01:21:31 +0300 Subject: [PATCH 3/9] Update solar_model.py --- solar_model.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/solar_model.py b/solar_model.py index 7cb63d65..e3de6c03 100644 --- a/solar_model.py +++ b/solar_model.py @@ -1,7 +1,7 @@ # coding: utf-8 # license: GPLv3 -gravitational_constant = 6.67408E-11 +G = 6.67408E-11 """Гравитационная постоянная Ньютона G""" @@ -19,9 +19,9 @@ 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): """Перемещает тело в соответствии с действующей на него силой. @@ -32,9 +32,11 @@ def move_space_object(body, dt): """ 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): From af4fce0337067f1a31165956530b2826f58e18d6 Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:31:07 +0300 Subject: [PATCH 4/9] Update solar_input.py --- solar_input.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/solar_input.py b/solar_input.py index a6b14ff1..5ed70262 100644 --- a/solar_input.py +++ b/solar_input.py @@ -19,10 +19,12 @@ 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") @@ -43,10 +45,11 @@ def parse_star_parameters(line): **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]) -def parse_planet_parameters(line, planet): +def parse_planet_parameters(line): """Считывает данные о планете из строки. Предполагается такая строка: Входная строка должна иметь слеюущий формат: @@ -61,6 +64,8 @@ def parse_planet_parameters(line, planet): **line** — строка с описание планеты. **planet** — объект планеты. """ + 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]) @@ -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: хорошо бы ещё сделать функцию, сохранающую статистику в заданный файл... From 9b8581652ab55cf08d87ebb795694b8b96132e9d Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:31:44 +0300 Subject: [PATCH 5/9] Update solar_main.py --- solar_main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solar_main.py b/solar_main.py index d77bddca..fa7cccb8 100644 --- a/solar_main.py +++ b/solar_main.py @@ -18,7 +18,7 @@ """Отображаемое на экране время. Тип: переменная tkinter""" -time_step = None +time_step = 0 """Шаг по времени при моделировании. Тип: float""" @@ -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) From 428576d912af122560b29fadcca657b5d0efa8df Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:32:24 +0300 Subject: [PATCH 6/9] Update solar_model.py --- solar_model.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/solar_model.py b/solar_model.py index e3de6c03..315bad30 100644 --- a/solar_model.py +++ b/solar_model.py @@ -1,15 +1,13 @@ # coding: utf-8 # license: GPLv3 -G = 6.67408E-11 +G = 6.76408E-11 """Гравитационная постоянная Ньютона G""" def calculate_force(body, space_objects): """Вычисляет силу, действующую на тело. - Параметры: - **body** — тело, для которого нужно вычислить дейстующую силу. **space_objects** — список объектов, которые воздействуют на тело. """ @@ -25,9 +23,7 @@ def calculate_force(body, space_objects): def move_space_object(body, dt): """Перемещает тело в соответствии с действующей на него силой. - Параметры: - **body** — тело, которое нужно переместить. """ @@ -41,9 +37,7 @@ def move_space_object(body, dt): def recalculate_space_objects_positions(space_objects, dt): """Пересчитывает координаты объектов. - Параметры: - **space_objects** — список оьъектов, для которых нужно пересчитать координаты. **dt** — шаг по времени """ From c9f48c3f67a28ce72e7cd511be478d8ea0462034 Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:33:14 +0300 Subject: [PATCH 7/9] Update solar_objects.py --- solar_objects.py | 94 ++++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/solar_objects.py b/solar_objects.py index 0c73668b..cbbdc09f 100644 --- a/solar_objects.py +++ b/solar_objects.py @@ -5,41 +5,41 @@ 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: @@ -47,36 +47,36 @@ 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 - """Изображение планеты""" \ No newline at end of file + self.image = None + """Изображение звезды""" From d91064866fab76faacdf075b764786bbb607d697 Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:34:10 +0300 Subject: [PATCH 8/9] Update solar_vis.py --- solar_vis.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/solar_vis.py b/solar_vis.py index 8016c457..d2f7f454 100644 --- a/solar_vis.py +++ b/solar_vis.py @@ -3,7 +3,7 @@ """Модуль визуализации. Нигде, кроме этого модуля, не используются экранные координаты объектов. -Функции, создающие гaрафические объекты и перемещающие их на экране, принимают физические координаты +Функции, создающие графические объекты и перемещающие их на экране, принимают физические координаты """ header_font = "Arial-16" @@ -24,7 +24,7 @@ def calculate_scale_factor(max_distance): """Вычисляет значение глобальной переменной **scale_factor** по данной характерной длине""" global scale_factor - scale_factor = 0.4 * min(window_height, window_width) / max_distance + scale_factor = 0.4*min(window_height, window_width)/max_distance print('Scale factor:', scale_factor) @@ -39,7 +39,7 @@ def scale_x(x): **x** — x-координата модели. """ - return int(x * scale_factor) + window_width // 2 + return int(x*scale_factor) + window_width//2 def scale_y(y): @@ -54,7 +54,7 @@ def scale_y(y): **y** — y-координата модели. """ - return int((-y) * scale_factor) + (window_height) // 2 + return int((-y)*scale_factor) + window_height//2 def create_star_image(space, star): @@ -65,11 +65,11 @@ def create_star_image(space, star): **space** — холст для рисования. **star** — объект звезды. """ + x = scale_x(star.x) y = scale_y(star.y) r = star.R - star.image = space.create_oval( - [x - r, y - r], [x + r, y + r], fill=star.color) + star.image = space.create_oval([x - r, y - r], [x + r, y + r], fill=star.color) def create_planet_image(space, planet): @@ -80,11 +80,11 @@ def create_planet_image(space, planet): **space** — холст для рисования. **planet** — объект планеты. """ + x = scale_x(planet.x) y = scale_y(planet.y) r = planet.R - planet.image = planet.create_oval( - [x - r, y - r], [x + r, y + r], fill=planet.color) + planet.image = space.create_oval([x - r, y - r], [x + r, y + r], fill=planet.color) def update_system_name(space, system_name): @@ -112,7 +112,7 @@ def update_object_position(space, body): r = body.R if x + r < 0 or x - r > window_width or y + r < 0 or y - r > window_height: space.coords(body.image, window_width + r, window_height + r, - window_width + 2 * r, window_height + 2 * r) # положить за пределы окна + window_width + 2*r, window_height + 2*r) # положить за пределы окна space.coords(body.image, x - r, y - r, x + r, y + r) From 030028252d9c70b8f13609d0189f93ff21eb1a57 Mon Sep 17 00:00:00 2001 From: Vorobusheg <55547385+Vorobusheg@users.noreply.github.com> Date: Thu, 21 Nov 2019 19:55:49 +0300 Subject: [PATCH 9/9] Update solar_system.txt --- solar_system.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solar_system.txt b/solar_system.txt index 7aa333bb..7a1c839e 100644 --- a/solar_system.txt +++ b/solar_system.txt @@ -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 # Юпитер @@ -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