-
Notifications
You must be signed in to change notification settings - Fork 507
/
solar_vis.py
116 lines (80 loc) · 4.21 KB
/
solar_vis.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# coding: utf-8
# license: GPLv3
"""Модуль визуализации.
Нигде, кроме этого модуля, не используются экранные координаты объектов.
Функции, создающие гaрафические объекты и перемещающие их на экране, принимают физические координаты
"""
header_font = "Arial-16"
"""Шрифт в заголовке"""
window_width = 800
"""Ширина окна"""
window_height = 800
"""Высота окна"""
scale_factor = None
"""Масштабирование экранных координат по отношению к физическим.
Тип: float
Мера: количество пикселей на один метр."""
def calculate_scale_factor(max_distance):
"""Вычисляет значение глобальной переменной **scale_factor** по данной характерной длине"""
global scale_factor
scale_factor = 0.4*min(window_height, window_width)/max_distance
print('Scale factor:', scale_factor)
def scale_x(x):
"""Возвращает экранную **x** координату по **x** координате модели.
Принимает вещественное число, возвращает целое число.
В случае выхода **x** координаты за пределы экрана возвращает
координату, лежащую за пределами холста.
Параметры:
**x** — x-координата модели.
"""
return int(x*scale_factor) + window_width//2
def scale_y(y):
"""Возвращает экранную **y** координату по **y** координате модели.
Принимает вещественное число, возвращает целое число.
В случае выхода **y** координаты за пределы экрана возвращает
координату, лежащую за пределами холста.
Направление оси развёрнуто, чтобы у модели ось **y** смотрела вверх.
Параметры:
**y** — y-координата модели.
"""
return y # FIXME: not done yet
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)
def create_planet_image(space, planet):
"""Создаёт отображаемый объект планеты.
Параметры:
**space** — холст для рисования.
**planet** — объект планеты.
"""
pass # FIXME: сделать как у звезды
def update_system_name(space, system_name):
"""Создаёт на холсте текст с названием системы небесных тел.
Если текст уже был, обновляет его содержание.
Параметры:
**space** — холст для рисования.
**system_name** — название системы тел.
"""
space.create_text(30, 80, tag="header", text=system_name, font=header_font)
def update_object_position(space, body):
"""Перемещает отображаемый объект на холсте.
Параметры:
**space** — холст для рисования.
**body** — тело, которое нужно переместить.
"""
x = scale_x(body.x)
y = scale_y(body.y)
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) # положить за пределы окна
space.coords(body.image, x - r, y - r, x + r, y + r)
if __name__ == "__main__":
print("This module is not for direct call!")