{"id":352652,"date":"2024-05-20T22:12:43","date_gmt":"2024-05-20T22:12:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=352652"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=352652","title":{"rendered":"<span>\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u0438)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0437\u0432\u0435\u0437\u0434\u044b? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0442\u0435\u043b\u0435\u0441\u043a\u043e\u043f! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0442\u043e, \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u043d\u0430\u0448\u0435\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u043a\u0430\u043a \u0431\u044b \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043b\u043d\u0446\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445.<\/p>\n<p>\u0414\u043e\u043b\u0433\u043e \u0442\u044f\u043d\u0443\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043a \u043a\u0440\u0430\u0442\u043a\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0420\u0435\u0448\u0438\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435. \u0421\u0443\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0441 \u043b\u044e\u0431\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c, \u043c\u0430\u0441\u0441\u043e\u0439, \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.\u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0443\u043c\u0431\u0443\u0440\u043d\u043e, \u0440\u0435\u0448\u0438\u043b \u0432 \u043a\u0443\u0441\u043a\u0438 \u0441 \u043a\u043e\u0434\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b: \u0441\u043e\u0437\u0434\u0430\u044e \u0421\u043e\u043b\u043d\u0446\u0435 \u0438 6 \u043f\u043b\u0430\u043d\u0435\u0442, \u043b\u0435\u0432\u044b\u043c \u043f\u0440\u0438\u0434\u0430\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445, \u0430 \u043f\u0440\u0430\u0432\u044b\u043c &#8212; \u0432\u043d\u0438\u0437, \u0440\u0430\u0432\u043d\u0443\u044e \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u043b\u0430\u043d\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430, \u0441\u0432\u043e\u0439 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u0421\u043e\u043b\u043d\u0446\u0430 \u043e\u043d\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/402\/f53\/7a7\/402f537a7e78462e0e6c6341b5a050bd.png\" width=\"1702\" height=\"305\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/402\/f53\/7a7\/402f537a7e78462e0e6c6341b5a050bd.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d9\/058\/46d\/4d905846d1c7d43a7fc11e0bdd345f59.png\" width=\"1283\" height=\"346\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d9\/058\/46d\/4d905846d1c7d43a7fc11e0bdd345f59.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bfb\/018\/edc\/bfb018edc2aaac5c5199f119a64471a8.png\" width=\"1416\" height=\"393\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfb\/018\/edc\/bfb018edc2aaac5c5199f119a64471a8.png\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u043b\u043e\u043a: \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/p>\n<pre><code class=\"python\">import pygame import time<\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u043e\u043a: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<pre><code class=\"python\">fps = 120  # \u043f\u0440\u043e\u0441\u0442\u043e fps G = 6.67 \/ 10 ** 11  # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 k = 1000000  # \u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 mouse_x, mouse_y = 0, 0  # \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u043a\u0438 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u043b\u0438\u044f\u044e\u0442) time_speed = 10000  # \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b # \u041f\u0440\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 10 ^ 5, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0431\u043b\u043e\u043a: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043a\u043d\u043e, \u0437\u0430\u0434\u0430\u0451\u043c \u0448\u0438\u0440\u0438\u043d\u0443, \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f fps \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"python\">pygame.init() screen = pygame.display.set_mode((1500, 800)) pygame.display.set_caption(\"Planetary acceleration\") style = pygame.font.SysFont(\"arial\", 36) render_fps = style.render('fps ' + str(fps), True, 'blue') render_time_speed = style.render('acceleration: ' + str(time_speed), True, 'blue')<\/code><\/pre>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0439 \u0431\u043b\u043e\u043a: \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043e\u0434\u043d\u0443 \u043f\u043b\u0430\u043d\u0435\u0442\u0443<\/p>\n<pre><code class=\"python\">class Planet:     def __init__(self, x, y, r, m, color):  # \u0437\u0430\u0434\u0430\u0451\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b         self.x = x  # \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u043e \u043e\u0441\u0438 \u041e\u0445         self.y = y  # \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u043e \u043e\u0441\u0438 \u041e\u0443         self.r = r  # \u0440\u0430\u0434\u0438\u0443\u0441 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.m = m  # \u043c\u0430\u0441\u0441\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.color = color  # \u0446\u0432\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.speed = [0, 0]  # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u0430          self.f = [0, 0]  # \u0441\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u0443         self.status = True  # \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u0430 \u0438\u043b\u0438 \u0443\u0436\u0435 \u043d\u0435\u0442         self.trace_count = 0  # \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \"\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e\" \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u0438\u043d\u0430\u0447\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0430\u043b\u043e \u0431\u044b fps         self.trace = []  # \u0442\u043e\u0447\u043a\u0438 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442\u044b      def update_coordinates(self):  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0438 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e         self.speed[0] += (self.f[0] \/ self.m) * time_speed ** 2 \/ fps ** 2          self.speed[1] += (self.f[1] \/ self.m) * time_speed ** 2 \/ fps ** 2          self.x += self.speed[0]         self.y += self.speed[1]          self.trace_count += (self.speed[0] ** 2 + self.speed[1] ** 2) ** 0.5          if self.trace_count \/ k >= 7:  # \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435             self.trace_count = 0             self.trace.append((self.x, self.y))         if len(self.trace) > 1000:  # \u0422\u0430\u043a\u0436\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u043b\u043e fps, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441 \u043a\u043e\u043d\u0446\u0430             self.trace.pop(0)      def draw(self):  # \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0438 \u0438\u0445 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438         pygame.draw.circle(screen, self.color, ((self.x - mouse_x) \/ k, (self.y - mouse_y) \/ k), self.r \/ k)         for i in self.trace:             pygame.draw.circle(screen, self.color, ((i[0] - mouse_x) \/ k, (i[1] - mouse_y) \/ k), 1)<\/code><\/pre>\n<p>\u041f\u044f\u0442\u044b\u0439 \u0431\u043b\u043e\u043a: \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043b\u0430\u043d\u0435\u0442\u0443<\/p>\n<pre><code class=\"python\">def update_forces(planets, collides):     for i in range(len(planets)):         for j in range(i + 1, len(planets)):             dif_x = planets[j].x - planets[i].x  # \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438 \u043f\u043e \u0445             dif_y = planets[j].y - planets[i].y  # \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438 \u043f\u043e y             d = (dif_x ** 2 + dif_y ** 2) ** 0.5  # \u043f\u0438\u0444\u0430\u0433\u043e\u0440\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438             f = G * planets[i].m * planets[j].m \/ d ** 2  # \u0421\u0438\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438              planets[i].f[0] += dif_x * f \/ d  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043b\u044b \u043d\u0430 \u0442\u0435\u043b\u043e             planets[i].f[1] += dif_y * f \/ d              planets[j].f[0] -= dif_x * f \/ d             planets[j].f[1] -= dif_y * f \/ d              if planets[i].r + planets[j].r > d:  # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0434\u0432\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c                 collides.append((i, j))<\/code><\/pre>\n<p>\u0428\u0435\u0441\u0442\u043e\u0439 \u0431\u043b\u043e\u043a: \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\">def remove_collides(planets, collides):     for i in collides:         p1 = planets[i[0]]         p2 = planets[i[1]]         if p1.status and p2.status:  # \u0435\u0441\u043b\u0438 \u043e\u0431\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0435\u0449\u0451 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442             if p1.m > p2.m:  # \u043a\u0430\u043a\u0430\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u043c\u0430\u0441\u0441\u0435, \u0442\u0430 \u0438 \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0430                 new_planet = Planet(p1.x, p1.y, p1.r + p2.r, p1.m + p2.m, p1.color)             else:                 new_planet = Planet(p2.x, p2.y, p1.r + p2.r, p1.m + p2.m, p2.color)              new_planet.speed = [(p1.m * p1.speed[0] + p2.m * p2.speed[0]) \/ (p1.m + p2.m),                                 (p1.m * p1.speed[1] + p2.m * p2.speed[1]) \/ (p1.m + p2.m)]              planets.append(new_planet)             p1.status = p2.status = 0<\/code><\/pre>\n<p>\u0421\u0435\u0434\u044c\u043c\u043e\u0439 \u0431\u043b\u043e\u043a: \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043e\u043b\u043d\u0446\u0435 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\">planets = []  # \u0421\u043e\u043b\u043d\u0446\u0435 p = Planet(0, 0, 696_000_000, 1.9891 * 10 ** 30, 'orange') planets.append(p)  for i in range(14, 20):     p = Planet((-1) ** i * (i * 10 ** 9 + 10 ** 9), 0, 1, 1, 'green')     planets.append(p)     planets[i - 13].speed[1] += (-1) ** i * 29273.6 * time_speed \/ fps<\/code><\/pre>\n<p>\u0412\u043e\u0441\u044c\u043c\u043e\u0439 \u0431\u043b\u043e\u043a: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0435\u0449\u0451 &#171;\u0436\u0438\u0432\u044b\u0435&#187; \u043f\u043b\u0430\u043d\u0435\u0442\u044b<\/p>\n<pre><code class=\"python\">tick = 0 tm = time.time() running = True  # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0446\u0438\u043a\u043b\u0430  while running:     tick += 1     if tick == 100:  # \u0447\u0442\u043e\u0431\u044b fps \u0432 \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u043b \u0441 \u0443\u043c\u0430 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u043b\u044c          tick = 0         render_fps = style.render(\"fps:\" + str(int(100 \/ (time.time() - tm))), True, \"blue\")         tm = time.time()      for event in pygame.event.get():  # \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b         if event.type == pygame.QUIT:  # \u0432\u044b\u0445\u043e\u0434             running = False          if event.type == pygame.MOUSEBUTTONDOWN:  # \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043b\u044e\u0431\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438             x = event.pos[0]  # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u044b\u0448\u043a\u0430 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f             y = event.pos[1]             new_x = mouse_x + x * k  # \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \"\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438\"             new_y = mouse_y + y * k              if event.button == 4:  # \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u043e \u043c\u044b\u0448\u043a\u0438 \u0432\u043f\u0435\u0440\u0451\u0434 - \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b                 k *= 0.85                 mouse_x = new_x - x * k                 mouse_y = new_y - y * k              if event.button == 5:  # \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u043e \u043c\u044b\u0448\u043a\u0438 \u043d\u0430\u0437\u0430\u0434 - \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b                 k \/= 0.85                 mouse_x = new_x - x * k                 mouse_y = new_y - y * k              if event.button == 3:  # \u043f\u0440\u0430\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438 - \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u0430\u043d\u0435\u0442\u0443 \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u044b\u0448\u043a\u0430                 planets.append(Planet(new_x, new_y, 6371000, 5.9722 * 10 ** 24, 'blue'))              if event.button == 2:  # \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u0430 - \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b                 if time_speed >= 100000:                     time_speed = 1                     for i in planets:                         i.speed[0] \/= 100000  # \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442                         i.speed[1] \/= 100000                 else:                     time_speed *= 10                     for i in planets:                         i.speed[0] *= 10                         i.speed[1] *= 10                  render_time_speed = style.render('acceleration: ' + str(time_speed), True, 'blue')  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f           if event.type == pygame.MOUSEMOTION:  # \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438             if pygame.mouse.get_pressed()[0]:                 mouse_x -= event.rel[0] * k                 mouse_y -= event.rel[1] * k      collides = []  # \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439      update_forces(planets, collides)  # \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f       remove_collides(planets, collides)  # \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f      screen.fill(\"black\")  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0447\u0451\u0440\u043d\u044b\u0439 \u0444\u043e\u043d      new_planets = []     for planet in planets:           if planet.status:  # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c             planet.update_coordinates()  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f             planet.f = [0, 0]  # \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043b\u044b             new_planets.append(planet)  # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \"\u0436\u0438\u0432\u044b\u0435\" \u043f\u043b\u0430\u043d\u0435\u0442\u044b             planet.draw()  # \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0441\u0451     planets = new_planets  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432      screen.blit(render_fps, (10, 10))  # \u0432\u044b\u0432\u043e\u0434\u0438\u043c fps     screen.blit(render_time_speed, (10, 50))  # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435      pygame.display.update() pygame.quit()  # \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c <\/code><\/pre>\n<p>\u0412\u0441\u0451. \u042d\u0442\u043e \u0432\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0421\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b!<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0421\u043e\u043b\u043d\u0446\u0430 \u0438 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\"># \u0417\u0435\u043c\u043b\u044f: p = Planet(-152 * 10 ** 9, 0, 6371000, 5.9722 * 10 ** 24, 'green') planets.append(p) planets[0].speed[1] += 29273.6 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u041b\u0443\u043d\u0430: p = Planet(-363104000 - 152 * 10 ** 9, 0, 1737100, 7.35 * 10 ** 22, 'grey') planets.append(p) planets[1].speed[1] = 1023 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0437\u0435\u043c\u043b\u0438 planets[1].speed[1] += 29273.6 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u041c\u0435\u0440\u043a\u0443\u0440\u0438\u0439 p = Planet(-69.8 * 10 ** 9, 0, 2439700, 3.33022 * 10 ** 23, \"yellow\") planets.append(p) planets[2].speed[1] += 38000 * time_speed \/ fps # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u0412\u0435\u043d\u0435\u0440\u0430 p = Planet(-109 * 10 ** 9, 0, 6051800, 4.8675 * 10 ** 24, \"white\") planets.append(p) planets[3].speed[1] += 34000 * time_speed \/ fps  # \u041c\u0430\u0440\u0441 p = Planet(-249.2 * 10 ** 9, 0, 3390000, 6.4171 * 10 ** 23, \"red\") planets.append(p) planets[4].speed[1] += 23000 * time_speed \/ fps  # \u042e\u043f\u0438\u0442\u0435\u0440 p = Planet(-816.521 * 10 ** 9, 0, 71492000, 1.8986 * 10 ** 27, \"brown\") planets.append(p) planets[5].speed[1] += 12500 * time_speed \/ fps  # \u0421\u0430\u0442\u0443\u0440\u043d p = Planet(-1.51 * 10 ** 12, 0, 60268000, 5.6846 * 10 ** 26, \"beige\") planets.append(p) planets[6].speed[1] += 9100 * time_speed \/ fps  # \u0423\u0440\u0430\u043d p = Planet(-3 * 10 ** 12, 0, 25362000, 8.6813 * 10 ** 25, \"pink\") planets.append(p) planets[7].speed[1] += 6300 * time_speed \/ fps  # \u041d\u0435\u043f\u0442\u0443\u043d p = Planet(-4.5 * 10 ** 12, 0, 24622000, 1.02409 * 10 ** 26, \"blue\") planets.append(p) planets[8].speed[1] += 4950 * time_speed \/ fps  # \u0421\u043e\u043b\u043d\u0446\u0435 p = Planet(0, 0, 696_000_000, 1.9891 * 10 ** 30, 'orange') planets.append(p)<\/code><\/pre>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u0437\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec5\/208\/6c4\/ec52086c4c18ab78b4ec2312b0949763.png\" alt=\"\u041c\u0435\u0440\u043a\u0443\u0440\u0438\u0439, \u0412\u0435\u043d\u0435\u0440\u0430, \u0417\u0435\u043c\u043b\u044f \u0441 \u041b\u0443\u043d\u043e\u0439 \u0438 \u041c\u0430\u0440\u0441. \u041d\u0430 \u041c\u0430\u0440\u0441\u0435 \u043d\u043e\u0432\u044b\u0439 \u0433\u043e\u0434 \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b :(\" title=\"\u041c\u0435\u0440\u043a\u0443\u0440\u0438\u0439, \u0412\u0435\u043d\u0435\u0440\u0430, \u0417\u0435\u043c\u043b\u044f \u0441 \u041b\u0443\u043d\u043e\u0439 \u0438 \u041c\u0430\u0440\u0441. \u041d\u0430 \u041c\u0430\u0440\u0441\u0435 \u043d\u043e\u0432\u044b\u0439 \u0433\u043e\u0434 \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b :(\" width=\"1141\" height=\"871\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec5\/208\/6c4\/ec52086c4c18ab78b4ec2312b0949763.png\"\/><\/p>\n<div><figcaption>\u041c\u0435\u0440\u043a\u0443\u0440\u0438\u0439, \u0412\u0435\u043d\u0435\u0440\u0430, \u0417\u0435\u043c\u043b\u044f \u0441 \u041b\u0443\u043d\u043e\u0439 \u0438 \u041c\u0430\u0440\u0441. \u041d\u0430 \u041c\u0430\u0440\u0441\u0435 \u043d\u043e\u0432\u044b\u0439 \u0433\u043e\u0434 \u0435\u0449\u0451 \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b \ud83d\ude41<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u0430\u043b\u0438\u043c\u0441\u044f \u043e\u0442 \u0421\u043e\u043b\u043d\u0446\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u044b<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9bc\/753\/767\/9bc753767f7eb0d0b7f6a2aeb688f764.png\" width=\"926\" height=\"740\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9bc\/753\/767\/9bc753767f7eb0d0b7f6a2aeb688f764.png\"\/><\/figure>\n<p>\u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0421\u043c\u0435\u043b\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0435!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/755724\/\"> https:\/\/habr.com\/ru\/articles\/755724\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0437\u0432\u0435\u0437\u0434\u044b? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0442\u0435\u043b\u0435\u0441\u043a\u043e\u043f! \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0442\u043e, \u043a\u0430\u043a \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u043d\u0430\u0448\u0435\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u043a\u0430\u043a \u0431\u044b \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u043b\u043d\u0446\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445.<\/p>\n<p>\u0414\u043e\u043b\u0433\u043e \u0442\u044f\u043d\u0443\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0443 \u043a \u043a\u0440\u0430\u0442\u043a\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0420\u0435\u0448\u0438\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435. \u0421\u0443\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0441 \u043b\u044e\u0431\u044b\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c, \u043c\u0430\u0441\u0441\u043e\u0439, \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.\u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0443\u043c\u0431\u0443\u0440\u043d\u043e, \u0440\u0435\u0448\u0438\u043b \u0432 \u043a\u0443\u0441\u043a\u0438 \u0441 \u043a\u043e\u0434\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b: \u0441\u043e\u0437\u0434\u0430\u044e \u0421\u043e\u043b\u043d\u0446\u0435 \u0438 6 \u043f\u043b\u0430\u043d\u0435\u0442, \u043b\u0435\u0432\u044b\u043c \u043f\u0440\u0438\u0434\u0430\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0432\u0435\u0440\u0445, \u0430 \u043f\u0440\u0430\u0432\u044b\u043c &#8212; \u0432\u043d\u0438\u0437, \u0440\u0430\u0432\u043d\u0443\u044e \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u043b\u0430\u043d\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430, \u0441\u0432\u043e\u0439 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0432\u043e\u043a\u0440\u0443\u0433 \u0421\u043e\u043b\u043d\u0446\u0430 \u043e\u043d\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0432 \u0440\u0430\u0437\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445. <\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u043b\u043e\u043a: \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/p>\n<pre><code class=\"python\">import pygame import time<\/code><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u043e\u043a: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<pre><code class=\"python\">fps = 120  # \u043f\u0440\u043e\u0441\u0442\u043e fps G = 6.67 \/ 10 ** 11  # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 k = 1000000  # \u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 mouse_x, mouse_y = 0, 0  # \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u043a\u0438 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u043b\u0438\u044f\u044e\u0442) time_speed = 10000  # \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b # \u041f\u0440\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 10 ^ 5, \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0431\u043b\u043e\u043a: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043a\u043d\u043e, \u0437\u0430\u0434\u0430\u0451\u043c \u0448\u0438\u0440\u0438\u043d\u0443, \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f fps \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f<\/p>\n<pre><code class=\"python\">pygame.init() screen = pygame.display.set_mode((1500, 800)) pygame.display.set_caption(\"Planetary acceleration\") style = pygame.font.SysFont(\"arial\", 36) render_fps = style.render('fps ' + str(fps), True, 'blue') render_time_speed = style.render('acceleration: ' + str(time_speed), True, 'blue')<\/code><\/pre>\n<p>\u0427\u0435\u0442\u0432\u0451\u0440\u0442\u044b\u0439 \u0431\u043b\u043e\u043a: \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043e\u0434\u043d\u0443 \u043f\u043b\u0430\u043d\u0435\u0442\u0443<\/p>\n<pre><code class=\"python\">class Planet:     def __init__(self, x, y, r, m, color):  # \u0437\u0430\u0434\u0430\u0451\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b         self.x = x  # \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u043e \u043e\u0441\u0438 \u041e\u0445         self.y = y  # \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u043e \u043e\u0441\u0438 \u041e\u0443         self.r = r  # \u0440\u0430\u0434\u0438\u0443\u0441 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.m = m  # \u043c\u0430\u0441\u0441\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.color = color  # \u0446\u0432\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u044b         self.speed = [0, 0]  # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u0430          self.f = [0, 0]  # \u0441\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u0443         self.status = True  # \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043b\u0430\u043d\u0435\u0442\u0430 \u0438\u043b\u0438 \u0443\u0436\u0435 \u043d\u0435\u0442         self.trace_count = 0  # \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \"\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e\" \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u0438\u043d\u0430\u0447\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0430\u043b\u043e \u0431\u044b fps         self.trace = []  # \u0442\u043e\u0447\u043a\u0438 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442\u044b      def update_coordinates(self):  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0438 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044e         self.speed[0] += (self.f[0] \/ self.m) * time_speed ** 2 \/ fps ** 2          self.speed[1] += (self.f[1] \/ self.m) * time_speed ** 2 \/ fps ** 2          self.x += self.speed[0]         self.y += self.speed[1]          self.trace_count += (self.speed[0] ** 2 + self.speed[1] ** 2) ** 0.5          if self.trace_count \/ k >= 7:  # \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u043d\u0430\u043a\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435             self.trace_count = 0             self.trace.append((self.x, self.y))         if len(self.trace) > 1000:  # \u0422\u0430\u043a\u0436\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u043b\u043e fps, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441 \u043a\u043e\u043d\u0446\u0430             self.trace.pop(0)      def draw(self):  # \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0438 \u0438\u0445 \u0442\u0440\u0430\u0435\u043a\u0442\u043e\u0440\u0438\u0438         pygame.draw.circle(screen, self.color, ((self.x - mouse_x) \/ k, (self.y - mouse_y) \/ k), self.r \/ k)         for i in self.trace:             pygame.draw.circle(screen, self.color, ((i[0] - mouse_x) \/ k, (i[1] - mouse_y) \/ k), 1)<\/code><\/pre>\n<p>\u041f\u044f\u0442\u044b\u0439 \u0431\u043b\u043e\u043a: \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0438\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043b\u0430\u043d\u0435\u0442\u0443<\/p>\n<pre><code class=\"python\">def update_forces(planets, collides):     for i in range(len(planets)):         for j in range(i + 1, len(planets)):             dif_x = planets[j].x - planets[i].x  # \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438 \u043f\u043e \u0445             dif_y = planets[j].y - planets[i].y  # \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438 \u043f\u043e y             d = (dif_x ** 2 + dif_y ** 2) ** 0.5  # \u043f\u0438\u0444\u0430\u0433\u043e\u0440\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438             f = G * planets[i].m * planets[j].m \/ d ** 2  # \u0421\u0438\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430\u043c\u0438              planets[i].f[0] += dif_x * f \/ d  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043b\u044b \u043d\u0430 \u0442\u0435\u043b\u043e             planets[i].f[1] += dif_y * f \/ d              planets[j].f[0] -= dif_x * f \/ d             planets[j].f[1] -= dif_y * f \/ d              if planets[i].r + planets[j].r > d:  # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u0434\u0432\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c                 collides.append((i, j))<\/code><\/pre>\n<p>\u0428\u0435\u0441\u0442\u043e\u0439 \u0431\u043b\u043e\u043a: \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\">def remove_collides(planets, collides):     for i in collides:         p1 = planets[i[0]]         p2 = planets[i[1]]         if p1.status and p2.status:  # \u0435\u0441\u043b\u0438 \u043e\u0431\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b \u0435\u0449\u0451 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442             if p1.m > p2.m:  # \u043a\u0430\u043a\u0430\u044f \u043f\u043b\u0430\u043d\u0435\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u043c\u0430\u0441\u0441\u0435, \u0442\u0430 \u0438 \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0430                 new_planet = Planet(p1.x, p1.y, p1.r + p2.r, p1.m + p2.m, p1.color)             else:                 new_planet = Planet(p2.x, p2.y, p1.r + p2.r, p1.m + p2.m, p2.color)              new_planet.speed = [(p1.m * p1.speed[0] + p2.m * p2.speed[0]) \/ (p1.m + p2.m),                                 (p1.m * p1.speed[1] + p2.m * p2.speed[1]) \/ (p1.m + p2.m)]              planets.append(new_planet)             p1.status = p2.status = 0<\/code><\/pre>\n<p>\u0421\u0435\u0434\u044c\u043c\u043e\u0439 \u0431\u043b\u043e\u043a: \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043e\u043b\u043d\u0446\u0435 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\">planets = []  # \u0421\u043e\u043b\u043d\u0446\u0435 p = Planet(0, 0, 696_000_000, 1.9891 * 10 ** 30, 'orange') planets.append(p)  for i in range(14, 20):     p = Planet((-1) ** i * (i * 10 ** 9 + 10 ** 9), 0, 1, 1, 'green')     planets.append(p)     planets[i - 13].speed[1] += (-1) ** i * 29273.6 * time_speed \/ fps<\/code><\/pre>\n<p>\u0412\u043e\u0441\u044c\u043c\u043e\u0439 \u0431\u043b\u043e\u043a: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0435\u0449\u0451 &#171;\u0436\u0438\u0432\u044b\u0435&#187; \u043f\u043b\u0430\u043d\u0435\u0442\u044b<\/p>\n<pre><code class=\"python\">tick = 0 tm = time.time() running = True  # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0446\u0438\u043a\u043b\u0430  while running:     tick += 1     if tick == 100:  # \u0447\u0442\u043e\u0431\u044b fps \u0432 \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u043b \u0441 \u0443\u043c\u0430 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u043b\u044c          tick = 0         render_fps = style.render(\"fps:\" + str(int(100 \/ (time.time() - tm))), True, \"blue\")         tm = time.time()      for event in pygame.event.get():  # \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b         if event.type == pygame.QUIT:  # \u0432\u044b\u0445\u043e\u0434             running = False          if event.type == pygame.MOUSEBUTTONDOWN:  # \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043b\u044e\u0431\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438             x = event.pos[0]  # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u044b\u0448\u043a\u0430 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f             y = event.pos[1]             new_x = mouse_x + x * k  # \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \"\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438\"             new_y = mouse_y + y * k              if event.button == 4:  # \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u043e \u043c\u044b\u0448\u043a\u0438 \u0432\u043f\u0435\u0440\u0451\u0434 - \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b                 k *= 0.85                 mouse_x = new_x - x * k                 mouse_y = new_y - y * k              if event.button == 5:  # \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u043e \u043c\u044b\u0448\u043a\u0438 \u043d\u0430\u0437\u0430\u0434 - \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u044b                 k \/= 0.85                 mouse_x = new_x - x * k                 mouse_y = new_y - y * k              if event.button == 3:  # \u043f\u0440\u0430\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438 - \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u0430\u043d\u0435\u0442\u0443 \u0432 \u0442\u043e\u0447\u043a\u0443, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u044b\u0448\u043a\u0430                 planets.append(Planet(new_x, new_y, 6371000, 5.9722 * 10 ** 24, 'blue'))              if event.button == 2:  # \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043e\u043b\u0451\u0441\u0438\u043a\u0430 - \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b                 if time_speed >= 100000:                     time_speed = 1                     for i in planets:                         i.speed[0] \/= 100000  # \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442                         i.speed[1] \/= 100000                 else:                     time_speed *= 10                     for i in planets:                         i.speed[0] *= 10                         i.speed[1] *= 10                  render_time_speed = style.render('acceleration: ' + str(time_speed), True, 'blue')  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f           if event.type == pygame.MOUSEMOTION:  # \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u043b\u0435\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u043c\u044b\u0448\u0438             if pygame.mouse.get_pressed()[0]:                 mouse_x -= event.rel[0] * k                 mouse_y -= event.rel[1] * k      collides = []  # \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439      update_forces(planets, collides)  # \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f       remove_collides(planets, collides)  # \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f      screen.fill(\"black\")  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0447\u0451\u0440\u043d\u044b\u0439 \u0444\u043e\u043d      new_planets = []     for planet in planets:           if planet.status:  # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c             planet.update_coordinates()  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f             planet.f = [0, 0]  # \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043b\u044b             new_planets.append(planet)  # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \"\u0436\u0438\u0432\u044b\u0435\" \u043f\u043b\u0430\u043d\u0435\u0442\u044b             planet.draw()  # \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0441\u0451     planets = new_planets  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432      screen.blit(render_fps, (10, 10))  # \u0432\u044b\u0432\u043e\u0434\u0438\u043c fps     screen.blit(render_time_speed, (10, 50))  # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435      pygame.display.update() pygame.quit()  # \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c <\/code><\/pre>\n<p>\u0412\u0441\u0451. \u042d\u0442\u043e \u0432\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0421\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b!<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0421\u043e\u043b\u043d\u0446\u0430 \u0438 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u043d\u0435\u0442<\/p>\n<pre><code class=\"python\"># \u0417\u0435\u043c\u043b\u044f: p = Planet(-152 * 10 ** 9, 0, 6371000, 5.9722 * 10 ** 24, 'green') planets.append(p) planets[0].speed[1] += 29273.6 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u041b\u0443\u043d\u0430: p = Planet(-363104000 - 152 * 10 ** 9, 0, 1737100, 7.35 * 10 ** 22, 'grey') planets.append(p) planets[1].speed[1] = 1023 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0437\u0435\u043c\u043b\u0438 planets[1].speed[1] += 29273.6 * time_speed \/ fps # \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u041c\u0435\u0440\u043a\u0443\u0440\u0438\u0439 p = Planet(-69.8 * 10 ** 9, 0, 2439700, 3.33022 * 10 ** 23, \"yellow\") planets.append(p) planets[2].speed[1] += 38000 * time_speed \/ fps # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u043e\u043b\u043d\u0446\u0430  # \u0412\u0435\u043d\u0435\u0440\u0430 p = Planet(-109 * 10 ** 9, 0, 6051800, 4.8675 * 10 ** 24, \"white\")<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-352652","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352652","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=352652"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/352652\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=352652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=352652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=352652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}