繁体   English   中英

如何获得 pygame 中两个向量之间的角度?

[英]How to get the angle between two vectors in pygame?

我希望我的玩家看向 pygame 中的某些坐标。 我试图通过获取播放器的 position 和坐标之间的角度,然后将播放器旋转该角度来做到这一点。 我为此使用了 function,function 在我需要我的播放器看向鼠标坐标时可以正常工作,但是当我使用相同的 ZC1C425268E68385D1AB5074C17A94F14F 看向播放器时失败。 这是使用的 function。

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 )

A 点 B

因此,两个向量之间的角度可以通过 2 个归一化向量( normalize() )的dot积的math.acos来计算:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM