Я рекомендую рассчитать вектор отражения для вектора падения на круговой поверхности.
В следующей формуле N
- это вектор нормали окружности, I
- вектор падения(текущий вектор направления прыгающего шара), а R
- вектор отражения (вектор исходящего направления прыгающего шара):
R = I - 2.0 * dot(N, I) * N.
Используйте pygame.math.Vector2
.
Чтобы рассчитать вектор нормали, необходимо знать точку "попадания" (dvx
, dvy
) и центральную точку круга (cptx
, cpty
):
circN = (pygame.math.Vector2(cptx - px, cpty - py)).normalize()
Рассчитать отражение:
vecR = vecI - 2 * circN.dot(vecI) * circN
Новый угол можно рассчитать как math.atan2(y, x)
:
self.angle = math.atan2(vecR[1], vecR[0])
Список кодов:
import math
import pygame
px = [...] # x coordinate of the "hit" point on the circle
py = [...] # y coordinate of the "hit" point on the circle
cptx = [...] # x coordinate of the center point of the circle
cpty = [...] # y coordinate of the center point of the circle
circN = (pygame.math.Vector2(cptx - px, cpty - py)).normalize()
vecI = pygame.math.Vector2(math.cos(self.angle), math.sin(self.angle))
vecR = vecI - 2 * circN.dot(vecI) * circN
self.angle = math.pi + math.atan2(vecR[1], vecR[0])