角度反射,用于将球弹起一圈

时间:2019-02-05 21:16:49

标签: python pygame geometry angle bounce

我正在制作一个带有一些弹跳元素的游戏(我使用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 :(得分:2)

我建议对圆形表面上的入射向量计算reflection向量。
在以下公式中,N是圆的法线向量,I是入射向量(弹跳球的当前方向向量),R是反射向量(出射方向向量)弹跳球)

R = I - 2.0 * dot(N, I) * N.

使用pygame.math.Vector2

要计算法线向量,您必须知道“命中”点(dvxdvy)和圆心(cptx,{{1} }):

cpty

计算反射:

circN = (pygame.math.Vector2(cptx - px, cpty - py)).normalize()

可以通过math.atan2(y, x)计算新角度:

vecR = vecI - 2 * circN.dot(vecI) * circN

代码清单:

self.angle  = math.atan2(vecR[1], vecR[0])
import math
import pygame

答案 1 :(得分:0)

三角形的内角总和为self.array_gpu = cuda.mem_alloc(some_array.nbytes)。同样,角度180°是三角形旁边的角度的补充(用99.96°称),即A就是99.96° + A = 180°。调用A = 180° - 99.96°的底角。对于最后一个角度B = 42.27°,我们可以说它与顶点相对,而另一个角度等于C。 然后:

2 * 28.85 = 57.7°

P.S .:我知道值并不完全相等,但这一定是因为小数点后的舍入