簡體   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