计算角度是否介于两个角度之间

2024-05-21 04:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我做了一个小游戏,我检查一个角色是否可以“看到”另一个角色,如果a在B的某个距离内,a的方向是B面对的角度的正负45度。

现在,我做了一个小计算

(facingAngle - 45) =< angleOfTarget =< (facingAngle + 45)

除了我们越过360度线外,这一切都很好。

假设facingAngle = 359, angleOfTarget = 5。在这种情况下,目标只偏离中心6度,所以我希望函数返回true。不幸的是,5不在314到404之间。


Tags: 函数true角色距离目标情况方向中心
3条回答

有一个三角解可以避免包装问题。

我假设字符P1P2都有(x,y)坐标。你已经指定了你知道这两个之间的距离,你大概是用毕达哥拉斯定理计算出来的。

可以使用两个向量的点积来计算它们之间的角度:

A . B = |A| . |B| . cos(theta).

如果你把A作为facingAngle向量,它将是[cos(fA), sin(fA)],其大小为|A|1。

如果将B作为两个字符之间的向量,并且您的上面距离得到:

cos(theta) = (cos(fA) * (P2x - P1x) + sin(fA) * (P2y - P1y)) / |B|

其中|B|是您已经计算的距离。

您不需要实际使用反余弦来查找theta,因为对于-45到+45的范围,您只需要检查cos(theta) >= 0.70710678(即1 / sqrt(2))。

这看起来可能有点复杂,但很可能你已经在程序中找到了所有需要的变量。

这是我在网上找到的一个简单的函数,并进行了修改。对于任何角度(可以在0-360之外)都可以正常工作。。(此函数在c中工作,在Xcode中工作。)

记住,它会逆时针检查从角度A到角度B。如果角度介于:,则返回YES(true)

首先,一个简单的转换函数,使所有的角度1-360

//function to convert angle to 1-360 degrees
 static inline double angle_1to360(double angle){
 angle=((int)angle % 360) + (angle-trunc(angle)); //converts angle to range -360 + 360
 if(angle>0.0)
 return angle;
 else
 return angle + 360.0;
 }

检查角度是否介于:)

//check if angle is between angles
 static inline BOOL angle_is_between_angles(float N,float a,float b) {
 N = angle_1to360(N); //normalize angles to be 1-360 degrees
 a = angle_1to360(a);
 b = angle_1to360(b);

 if (a < b)
 return a <= N && N <= b;
 return a <= N || N <= b;
 }

enter image description here

检查角度300是否在180到10度之间:

BOOL isBetween=angle_is_between_angles( 300, 180,10);

//返回YES

试试看

anglediff = (facingAngle - angleOfTarget + 180 + 360) % 360 - 180

if (anglediff <= 45 && anglediff>=-45) ....

原因是角度的差异是facingAngle - angleOfTarget尽管由于包装效果,可能会关闭360度。

加法180+360,然后模360,然后减法180,实际上就是把所有的东西都转换成-180到180度的范围(通过加减360度)。

然后你可以很容易地检查角度差,是否在-45到45度之间。

相关问题 更多 >