Top.Mail.Ru
Ответы

Не могу найти проблему кода

В кратце код должен визуализировать взаимодействие гравитационных сил друг на друга, но за место этого есть проблемы в симуляции

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
 #Импортирую библиотеки 
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) #Задержка до следующего начала цикла 
 
По дате
По Рейтингу
Аватар пользователя
Оракул
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
 #Импортирую библиотеки  
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 для второго объекта

# ...
```

После внесения этих изменений ваша симуляция должна работать корректно.

Удаленный ответ Ответ удалён
Удаленный ответ Ответ удалён