python - 如何在pygame中获得两个向量之间的角度?
问题描述
我希望我的玩家在 pygame 中寻找一些特定的坐标。我试图通过获取玩家位置和坐标之间的角度,然后将玩家旋转该角度来做到这一点。我为此使用了一个函数,当我需要我的玩家看向鼠标的坐标时,该函数可以正常工作,但是当我使用相同的函数让僵尸看向玩家时失败。这是使用的功能。
def rotate_char(khiladi,vector,old_center,angle=False) :
x1, y1 = vector
x2, y2 = khiladi.pos
dx, dy = x2 - x1, y2 - y1
rads = atan2(dx, dy)
degs = degrees(rads)
r_khiladi = pygame.transform.rotate(khiladi.image, degs)
R_k = r_khiladi.get_rect()
R_k.center = old_center
screen.blit(r_khiladi, (R_k))
if angle : return degs
我使用了另一种使用 numpy 的方法
v1_u = list(khiladi.pos / linalg.norm(khiladi.pos))
v2_u = list(vector / linalg.norm(vector))
v1_u[1] , v2_u[1] = -v1_u[1] , -v2_u[1]
c_angle = degrees(arccos(clip(dot(v1_u, v2_u), -1.0, 1.0)))
当我试图打印角度时,它们完全偏离了标记,甚至没有显示任何图案。请帮忙
解决方案
我建议使用pygame.math.Vector2
/angle_to()
来计算 2 个向量之间的角度(以度为单位)。
如果(x1, y1)和(x2, y2)是 2 个向量,那么向量之间的夹角为:
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
angle_v1_v2_degree = v1.angle_to(v2)
一般来说,两个向量的点积等于两个向量之间的夹角的余弦乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( angle_A_B )
因此, 2 个单位向量的点积等于 2 个向量之间夹角的余弦,因为单位向量的长度为 1。
uA = normalize( A )
uB = normalize( B )
cos( angle_A_B ) == dot( uA, uB )
因此,两个向量之间的角度可以通过2 个归一化向量(normalize()math.acos
)的乘积来计算:dot
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
v1u_dot_v2u = v1.normalize().dot(v2.normalize())
angle_v1_v2_radian = math.acos(v1u_dot_v2u)
推荐阅读
- python - 根据总行条件对数据框进行子集化
- c# - 使用 Process.StartInfo.Arguments 启动 bluestacks
- javascript - Fullcalendar:如何显示具有多个事件的多个资源
- windows - network-bsd 隐藏,因此未找到
- r - 计算矩阵中的滚动平均值
- c# - 无法使用 LinqToTwitter 搜索推文
- android - Android Recyclerview 直到 EditText 框才出现
- prolog - Prolog clpfd :: 预期操作员
- error-handling - 如何为自定义错误类型实现 From 特征?
- python-3.x - 从 fashion_MNIST 数据打印图像会给出彩色图像?