Отражение угла для прыгающего мяча по кругу - PullRequest
0 голосов
/ 06 февраля 2019

Я играю в игру с несколькими прыгающими элементами по кругу (я использую pygame). У моих элементов есть 2 атрибута: один для угла и один для скорости. Вот как элементы движутся:

mvx = math.sin(self.angle) * self.speed  
mvy = -math.cos(self.angle) * self.speed  
self.x += mvx  
self.y += mvy

Моя проблема заключается в следующем: я знаю угол вверху (99,6 °), у меня есть точка столкновения (x и y), но я не могу найти угол внизу (42,27 °). Может ли кто-нибудь сделатьсвязь между первым углом и вторым?

Картинка лучше ...

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я рекомендую рассчитать вектор отражения для вектора падения на круговой поверхности.
В следующей формуле 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])
0 голосов
/ 06 февраля 2019

Внутренние углы треугольника должны быть суммированы до 180°.Кроме того, угол 99.96° является дополнительным к углу треугольника рядом с ним (называем его A), то есть 99.96° + A = 180°, поэтому A = 180° - 99.96°.Вызов B = 42.27° нижний угол.И для последнего угла C мы можем использовать его как противоположность вершине с другим углом, равным 2 * 28.85 = 57.7°.Тогда:

A + B + C = 180°

180° - 99.96° + 42.27°  + 2 * 28.85° = 180°

180° - 99.96° + 42.27°  + 2 * 28.85° = 180°

-99.96° + 42.27°  + 2 * 28.85° = 0°

42.27°  + 2 * 28.85° = 99.96°

B + C = Top angle

PS: я знаю, что значения не совсем равны, но это должно быть из-за округления десятичных знаков

...