python-角度反射,用于将球d起一圈

python-角度反射,用于将球d起一圈,第1张

概述我正在制作一个带有一些d跳元素的游戏(我使用pygame),我的元素有2个属性,一个是角度,一个是速度这是元素移动的方式:mvx = math.sin(self.angle) * self.speed mvy = -math.cos(self.angle) * self.speed self.x += mvx self.y += mvy 我的问题

我正在制作一个带有一些d跳元素的游戏(我使用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是入射向量(d跳球的当前方向向量),R是反射向量(d跳球的出射方向向量):

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 mathimport pygame
px = [...] # x coordinate of the "hit" point on the circlepy = [...] # y coordinate of the "hit" point on the circlecptx = [...] # x coordinate of the center point of the circlecpty = [...] # y coordinate of the center point of the circlecircN = (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) * circNself.angle = math.pi + math.atan2(vecR[1],vecR[0])
总结

以上是内存溢出为你收集整理的python-角度反射,用于将球d起一圈 全部内容,希望文章能够帮你解决python-角度反射,用于将球d起一圈 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存