我正在制作一个带有一些弹跳元素的游戏(我使用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°)
有人可以在第一个角度和第二个角度之间建立关系吗?
图片更好…
最佳答案
我建议将reflection向量计算为圆形表面上的入射向量.
在以下公式中,N是圆的法线向量,I是入射向量(弹跳球的当前方向向量),R是反射向量(弹跳球的出射方向向量):
原文链接:https://www.f2er.com/python/533106.html在以下公式中,N是圆的法线向量,I是入射向量(弹跳球的当前方向向量),R是反射向量(弹跳球的出射方向向量):
R = I - 2.0 * dot(N,I) * N.
要计算法线向量,您必须知道“命中”点(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])