Skip to content

сделал свою часть #54

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

39 changes: 32 additions & 7 deletions solar_input.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,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": # FIXME: do the same for planet: DONE
star = Star()
parse_star_parameters(line, star)
star = parse_star_parameters(line, star)
objects.append(star)
elif object_type == "planet":
planet = Planet()
planet = parse_planet_parameters(line, planet)
objects.append(planet)
else:
print("Unknown space object")

Expand All @@ -32,7 +36,7 @@ def read_space_objects_data_from_file(input_filename):
def parse_star_parameters(line, star):
"""Считывает данные о звезде из строки.
Входная строка должна иметь слеюущий формат:
Star <радиус в пикселах> <цвет> <масса> <x> <y> <Vx> <Vy>
0) Star 1) <радиус в пикселах> 2)<цвет> 3)<масса> 4)<x> 5)<y> 6)<Vx> 7)<Vy>

Здесь (x, y) — координаты зведы, (Vx, Vy) — скорость.
Пример строки:
Expand All @@ -44,7 +48,17 @@ def parse_star_parameters(line, star):
**star** — объект звезды.
"""

pass # FIXME: not done yet
param = line.split()
star.type = param[0].lower()
star.R = float(param[1])
star.color = param[2]
star.m = float(param[3])
star.x = float(param[4])
star.y = float(param[5])
star.Vx = float(param[6])
star.Vy = float(param[7])
return star


def parse_planet_parameters(line, planet):
"""Считывает данные о планете из строки.
Expand All @@ -61,7 +75,16 @@ def parse_planet_parameters(line, planet):
**line** — строка с описание планеты.
**planet** — объект планеты.
"""
pass # FIXME: not done yet...
param = line.split()
planet.type = param[0].lower()
planet.R = float(param[1])
planet.color = param[2]
planet.m = float(param[3])
planet.x = float(param[4])
planet.y = float(param[5])
planet.Vx = float(param[6])
planet.Vy = float(param[7])
return planet


def write_space_objects_data_to_file(output_filename, space_objects):
Expand All @@ -77,8 +100,10 @@ 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: should store real values: DONE


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

Expand Down
4 changes: 3 additions & 1 deletion solar_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# license: GPLv3

import tkinter

from tkinter.filedialog import *
from solar_vis import *
from solar_model import *
Expand Down Expand Up @@ -148,5 +149,6 @@ def main():
root.mainloop()
print('Modelling finished!')


if __name__ == "__main__":
main()
main()
23 changes: 16 additions & 7 deletions solar_model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# coding: utf-8
# license: GPLv3
import math
import numpy

gravitational_constant = 6.67408E-11
"""Гравитационная постоянная Ньютона G"""
Expand All @@ -18,9 +20,14 @@ def calculate_force(body, space_objects):
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: нужно вывести формулу...
r = ((body.x - obj.x) ** 2 + (body.y - obj.y) ** 2) ** 0.5
if body.x == obj.x:
angle = math.pi / 2
else:
angle = math.atan(abs((body.y - obj.y) / (body.x - obj.x)))
F = gravitational_constant * obj.m * body.m / r ** 2
body.Fx += F * math.cos(angle) * numpy.sign(obj.x - body.x)
body.Fy += F * math.sin(angle) * numpy.sign(obj.y - body.y)


def move_space_object(body, dt):
Expand All @@ -31,10 +38,12 @@ 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!
ax = body.Fx / body.m
ay = body.Fy / body.m
body.x += body.Vx
body.Vx += ax * dt
body.y += body.Vy
body.Vy += ay * dt


def recalculate_space_objects_positions(space_objects, dt):
Expand Down
15 changes: 10 additions & 5 deletions solar_vis.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
window_width = 800
"""Ширина окна"""

window_height = 800
window_height = 600
"""Высота окна"""

scale_factor = None
Expand All @@ -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)


Expand All @@ -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):
Expand All @@ -54,7 +54,7 @@ def scale_y(y):
**y** — y-координата модели.
"""

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


def create_star_image(space, star):
Expand All @@ -80,6 +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 = space.create_oval([x - r, y - r], [x + r, y + r], fill=planet.color)

pass # FIXME: сделать как у звезды


Expand Down Expand Up @@ -108,7 +113,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)


Expand Down