首页 > 解决方案 > 如何在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)))

当我试图打印角度时,它们完全偏离了标记,甚至没有显示任何图案。请帮忙

标签: pythonnumpypygameangle

解决方案


我建议使用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 )

A 点 B

因此,两个向量之间的角度可以通过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)

推荐阅读