Добавление коллизии кругам
Нашла следующую программу, но не знаю как добавить столкновение между кругами. Возможно ли их сюда добавить? Может у кого-нибудь есть пример, где это реализовано подобное.
import pygame
import math
pygame.init()
pygame.display.set_caption("Floating Balls")
width = 1400
height = 800
win = pygame.display.set_mode((width,height))
nn=2
rB = [] #радиус
mB = [] # масса
xB = [] # координата
yB = [] # координата
aB = [] # направление движение по градусам
vB = [] # скорость
cB = [] # цвет
for i in range(nn +1):
rB.append(50 * i)
mB.append(rB[i] ** 2)
xB.append(i * 400)
yB.append(height // 2)
aB.append(i * math.pi / 3)
vB.append(2)
cB.append(0)
cB[1] = (255,0,0)
cB[2] = (0,255,0)
var_ = True
while var_:
for event in pygame.event.get():
if event.type == pygame.QUIT:
var_ = False
win.fill((0,0,0))
for i in range(1, nn+1):
xB[i] += vB[i] * math.cos(aB[i])
yB[i] += vB[i] * math.sin(aB[i])
pygame.draw.circle(win, cB[i], (xB[i], yB[i]), rB[i])
pygame.time.delay(10)
pygame.display.update()
#столкновение со стенами
for i in range(1, nn+1):
if xB[i] <= rB[i] and (aB[i] > math.pi / 2 or aB[i] < -math.pi / 2):
aB[i] = math.pi - aB[i]
if xB[i] >= width - rB[i] and (aB[i] > -math.pi / 2 and aB[i] < math.pi / 2):
aB[i] = math.pi - aB[i]
if yB[i] <= rB[i] and (aB[i] < 0 and aB[i] > -math.pi):
aB[i] = -aB[i]
if yB[i] >= height - rB[i] and (aB[i] > 0 and aB[i] < math.pi):
aB[i] = -aB[i]
while aB[i] > math.pi: aB[i] -= 2 * math.pi
while aB[i] < - math.pi: aB[i] += 2 * math.pi
for i in range(1, nn+1):
for j in range(i+1, nn+1):
Rast = ((xB[i] - xB[j]) ** 2 + (yB[i] - yB[j]) ** 2) **0.5
if Rast <= rB[i] + rB[j]:
xB1new = xB[i] + vB[i] * math.cos(aB[i])
yB1new = yB[i] + vB[i] * math.sin(aB[i])
xB2new = xB[j] + vB[j] * math.cos(aB[i])
yB2new = yB[j] + vB[j] * math.sin(aB[i])
# новое расстрояние между кругами
RastNew = ((xB1new - xB2new) ** 2 + (yB1new - yB2new) ** 2) ** 0.5
if Rast > RastNew:
BB = math.atan((yB[j] - yB[i])/(xB[j] - xB[i]))
if (xB[j] - xB[i]) < 0:
BB += math.pi
while BB > math.pi / 2: BB -= 2 * math.pi
while BB < - math.pi / 2: BB +=2 * math.pi
# Угол от луча W (между центрами шаров) до направление движения шаров
W1 = aB[i] - BB
W2 = aB[j] - BB
# перпендикуляр для понимания
Vw1 = vB[i] * math.cos(W1)
Vw2 = vB[j] * math.cos(W2)
Vwt1 = vB[i] * math.sin(W1)
Vwt2 = vB[j] * math.sin(W2)
#проектиця скорости после столкновения
Vw1 = (2 * mB[j] * vB[j] * math.cos(W2) + (mB[i] - mB[j]) * vB[i] * math.cos(W1)) / (mB[i] + mB[j])
Vw2 = (2 * mB[i] * vB[i] * math.cos(W1) + (mB[j] - mB[i]) * vB[j] * math.cos(W2)) / (mB[i] + mB[j])
#скорость после соприкосновения
vB[i] = (Vw1 ** 2 + Vwt1 ** 2) ** 0.5
vB[j] = (Vw2 ** 2 + Vwt2 ** 2) ** 0.5
#угол направления движения после соприкосновения
W1 = math.atan(Vwt1/Vw1)
if Vw1 < 0: W1 += math.pi
W2 = math.atan(Vwt2/Vw2)
if Vw2 < 0: W2 += math.pi
pygame.quit()