Не могу найти проблему кода
В кратце код должен визуализировать взаимодействие гравитационных сил друг на друга, но за место этого есть проблемы в симуляции
#Импортирую библиотеки
import numpy
import pygame
import sys
pygame.init()
clock = pygame.time.Clock()
width = 600 #Ширина окна
height = 400 #Высота окна
screen = pygame.display.set_mode((width, height)) #Инициализоция окна
pygame.display.set_caption("") #Установка названия окна
# [ 0, 1, 2, 3, 4, 5, 6]
# [ x, y, ex, ey, mass, angle, size]
n = numpy.array([[200, 100, 0, 0, 10*1, 0, 5],
[300, 200, 0, 0, 10*4, 0, 10],]) #Массив для хранения координат, энерции по координате, массу, угол (в радианах) и размер в радиусе
G = 6.67430e-11 * 10**12 #Создание константы с значением постоянной гравитационной
#Основной цикл
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
screen.fill((0, 0, 0)) #Очистка экрана чёрным цветом
x1, y1 = n[0, 0], n[0, 1] #Получение значений координат по двум осям первого объекта
x2, y2 = n[1, 0], n[1, 1] #Получение значений координат по двум осям первого объекта
m1, m2 = n[0, 4], n[1, 4] #Получение значений весов для обеих объектов
dis = numpy.sqrt((x2-x1)**2 + (y2-y1)**2) #Расчёт росстояния между объектами
angle = numpy.arctan2(y2 - y1, x2 - x1) #Расчёт альфы угла в радианах
f = G * ((n[0, 4] * n[1, 4]) / dis**2) #Расчёт силы притяжения мужду двух объектов
f1, f2 = f / n[0, 4], f / n[1, 4] #Расчёт силы для каждого объекта с учётом веса
n[0, 5], n[1, 5] = angle, angle*-1 #Записывание значений угла в массив
n[0, 0] += f1 / (m2 / m1) * numpy.cos(angle) #Изменение координат по x для первого объекта
n[0, 1] += f1 / (m2 / m1) * numpy.sin(angle) #Изменение координат по y для первого объекта
n[1, 0] += f2 / (m1 / m2) * numpy.cos(angle) #Изменение координат по x для второго объекта
n[1, 1] += f2 / (m1 / m2) * numpy.sin(angle) #Изменение координат по y для второго объекта
pygame.draw.circle(screen, (255, 255, 255), (n[0, 0], n[0, 1]), n[0, 6]) #Отрисовка второго круга
pygame.draw.circle(screen, (255, 255, 255), (n[1, 0], n[1, 1]), n[1, 6]) #Отрисовка второго круга
pygame.display.flip() #Обновление экрана
clock.tick(60) #Задержка до следующего начала цикла
#Импортирую библиотеки
import numpy
import pygame
import sys
pygame.init()
clock = pygame.time.Clock()
width = 600 #Ширина окна
height = 400 #Высота окна
screen = pygame.display.set_mode((width, height)) #Инициализоция окна
pygame.display.set_caption("") #Установка названия окна
# [ 0, 1, 2, 3, 4, 5, 6]
# [ x, y, ex, ey, mass, angle, size]
n = numpy.array([[200, 100, 0, 0, 10*1, 0, 5],
[300, 200, 0, 0, 10*4, 0, 10],]) #Массив для хранения координат, энерции по координате, массу, угол (в радианах) и размер в радиусе
G = 6.67430e-11 * 10**12 #Создание константы с значением постоянной гравитационной
#Функция для обновления энергии по координате
def update_energy(fx,fy,i):
n[i][2] += fx #Прибавляем к ex силу по x
n[i][3] += fy #Прибавляем к ey силу по y
#Функция для изменения координат
def update_position(i):
n[i][0] += n[i][2] / n[i][4] #Изменяем x на основе ex и массы
n[i][1] += n[i][3] / n[i][4] #Изменяем y на основе ey и массы
#Функция для проверки столкновения
def check_collision(i,j):
global n
if numpy.sqrt((n[i][0]-n[j][0])**2 + (n[i][1]-n[j][1])**2) <= n[i][6] + n[j][6]: #Если расстояние меньше суммы радиусов
#Рассчитываем новые значения энергии по координате по закону сохранения импульса
ex1 = (n[i][2] * (n[i][4] - n[j][4]) + 2 * n[j][4] * n[j][2]) / (n[i][4] + n[j][4])
ey1 = (n[i][3] * (n[i][4] - n[j][4]) + 2 * n[j][4] * n[j][3]) / (n[i][4] + n[j][4])
ex2 = (n[j][2] * (n[j][4] - n[i][4]) + 2 * n[i][4] * n[i][2]) / (n[i][4] + n[j][4])
ey2 = (n[j][3] * (n[j][4] - n[i][4]) + 2 * n[i][4] * n[i][3]) / (n[i][4] + n[j][4])
#Обновляем значения энергии по координате
n[i][2], n[i][3], n[j][2], n[j][3] = ex1, ey1, ex2, ey2
#Рассчитываем новые значения размера по закону сохранения энергии
size1 = numpy.sqrt((n[i][6]**2 * n[i][4] + n[j][6]**2 * n[j][4]) / (n[i][4] + n[j][4]))
size2 = size1
#Обновляем значения размера
n[i][6], n[j][6] = size1, size2
#Основной цикл
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
screen.fill((0, 0, 0)) #Очистка экрана чёрным цветом
x1, y1 = n[0, 0], n[0, 1] #Получение значений координат по двум осям первого объекта
x2, y2 = n[1, 0], n[1, 1] #Получение значений координат по двум осям первого объекта
m1, m2 = n[0, 4], n[1, 4] #Получение значений весов для обеих объектов
dis = numpy.sqrt((x2-x1)**2 + (y2-y1)**2) #Расчёт росстояния между объектами
angle = numpy.arctan2(y2 - y1, x2 - x1) #Расчёт альфы угла в радианах
f = G * ((n[0, 4] * n[1, 4]) / dis**2) #Расчёт силы притяжения мужду двух объектов
f1, f2 = f / m1, f / m2 #Расчёт силы для каждого объекта с учётом веса
fx1, fy1 = f1 * numpy.cos(angle), f1 * numpy.sin(angle) #Расчёт силы по x и y для первого объекта
fx2, fy2 = f2 * numpy.cos(angle), f2 * numpy.sin(angle) #Расчёт силы по x и y для второго объекта
update_energy(fx1,fy1,0) #Обновляем энергию по координате для первого объекта
update_energy(fx2,fy2,1) #Обновляем энергию по координате для второго объекта
Проблема в вашем коде заключается в некорректной обработке угла при расчете изменения координат. В строках, где вы обновляете координаты объектов, вы используете переменную `angle`, которая представляет собой угол между объектами. Однако, при обновлении координат для второго объекта, вы передаете ту же самую переменную `angle`, что приводит к неправильным результатам.
Чтобы исправить эту проблему, вы можете сохранить отдельные значения углов для каждого объекта. Вам потребуется добавить две дополнительные переменные: `angle1` для первого объекта и `angle2` для второго объекта. Затем, при расчете изменения координат для второго объекта, используйте соответствующую переменную `angle2`.
Вот обновленный код с исправлениями:
```python
# ...
angle1 = n[0, 5]
angle2 = n[1, 5]
# ...
n[1, 0] += f2 / (m1 / m2) * numpy.cos(angle2) # Изменение координат по x для второго объекта
n[1, 1] += f2 / (m1 / m2) * numpy.sin(angle2) # Изменение координат по y для второго объекта
# ...
```
После внесения этих изменений ваша симуляция должна работать корректно.