Python 如何在pygame中找到两点之间的角度?

Python 如何在pygame中找到两点之间的角度?,python,geometry,line,pygame,Python,Geometry,Line,Pygame,我正在用Pygame用Python编写一个游戏。 (我的显示窗口的)命令是 (0,0)位于左上角和 (640480)位于右下角 角度是 0°指向上时, 当指向右侧时,90° 我有一个中心位置的玩家精灵,我希望枪上的炮塔指向玩家。我该怎么做? 说, x1,y1是炮塔的共同名称 x2,y2是玩家的共同语言 a是考虑三角形的角度测量值 sin(angle)=opposed side / hypotenuse 你可能会想要这样的东西-你可能需要拉一点小提琴-我可能会偏离180度。您还需要对dy==0的

我正在用Pygame用Python编写一个游戏。
(我的显示窗口的)命令是
(0,0)
位于左上角和
(640480)
位于右下角

角度是
指向上时,
当指向右侧时,
90°

我有一个中心位置的玩家精灵,我希望枪上的炮塔指向玩家。我该怎么做?
说,
x1
y1
是炮塔的共同名称
x2
y2
是玩家的共同语言
a
是考虑三角形的角度测量值

sin(angle)=opposed side / hypotenuse

你可能会想要这样的东西-你可能需要拉一点小提琴-我可能会偏离180度。您还需要对dy==0的情况进行特殊处理,这不是我为您做的

import math
# Compute x/y distance
(dx, dy) = (x2-x1, y2-y1)
# Compute the angle
angle = math.atan(float(dx)/float(dy))
# The angle is in radians (-pi/2 to +pi/2).  If you want degrees, you need the following line
angle *= 180/math.pi
# Now you have an angle from -90 to +90.  But if the player is below the turret,
# you want to flip it
if dy < 0:
   angle += 180
导入数学
#计算x/y距离
(dx,dy)=(x2-x1,y2-y1)
#计算角度
角度=数学坐标(浮点(dx)/浮点(dy))
#角度以弧度为单位(-pi/2到+pi/2)。如果你想要学位,你需要下面这行
角度*=180/math.pi
#现在你有一个从-90到+90的角度。但是如果玩家在炮塔下面,
#你想把它翻过来吗
如果dy<0:
角度+=180

首先,
数学
有一个方便的
atan2(分母、分子)
函数。通常,您会使用
atan2(dy,dx)
,但由于Pygame会相对于笛卡尔坐标翻转y轴(如您所知),因此需要将
dy
设置为负值,然后避免使用负值。(“dy”只是指“y的变化”。)


degs
应该是你要找的东西。

好的,结合你的答案和一些其他网站,我找到了工作代码:

dx,dy = x2-x1,y2-y1

rads = math.atan2(dx/dy)
degs = math.degrees(rads)

我的代码的其余部分对degs的负值并不挑剔;不管怎样,它现在起作用了,我想说谢谢你的帮助。

作为未来的建议,如果你总结一下你已经尝试过的,失败的原因,以及你需要帮助的地方,你会得到更好的帮助。你需要三个点来定义一个角度。我想我们可以假设正x轴上的第三个点,原点是(x1,y1).实际上,mgold使用atan2的解决方案更好-它避免了我的解决方案中dy<0的部分,因为atan2自动处理它,所以它是不正确的;dy应该在dx上,而不是相反。不,正如OP和mgold都提到的,0度被指定在y方向,所以它是dx/dyAhh,好的,我的坏。这就是我没有仔细阅读的原因。在网上搜索了一段时间后,我找到了一本关于三角函数的好指南。你的回答有点正确。只需移除
rads%=2*pi
并使用
rads=atan2(dy,dx)
;如果你画一个三角形,你就会明白为什么。正如在文章中提到的,Pygame不使用传统的笛卡尔坐标。上升意味着y的减少。因此是负y和范围修正(否则将得到-90度而不是270度)。由于代码赢得参数,请使用此小程序:将此代码发布到我在回答的注释中链接的小程序中,您将看到为什么这不起作用。它将0度设为270度。所以您需要
rads-=math.pi/2
。另外,正是因为您现在的代码接受负角度,所以您将来编写的代码可能不会接受负角度。这种解决方案是不好的,因为反角度可能等于零,python将崩溃。
dx,dy = x2-x1,y2-y1

rads = math.atan2(dx/dy)
degs = math.degrees(rads)