//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;
}
有一个三角解可以避免包装问题。
我假设字符
P1
和P2
都有(x,y)坐标。你已经指定了你知道这两个之间的距离,你大概是用毕达哥拉斯定理计算出来的。可以使用两个向量的点积来计算它们之间的角度:
如果你把
A
作为facingAngle
向量,它将是[cos(fA), sin(fA)]
,其大小为|A|
1。如果将
B
作为两个字符之间的向量,并且您的上面距离得到:其中
|B|
是您已经计算的距离。您不需要实际使用反余弦来查找
theta
,因为对于-45到+45的范围,您只需要检查cos(theta) >= 0.70710678
(即1 / sqrt(2)
)。这看起来可能有点复杂,但很可能你已经在程序中找到了所有需要的变量。
这是我在网上找到的一个简单的函数,并进行了修改。对于任何角度(可以在0-360之外)都可以正常工作。。(此函数在c中工作,在Xcode中工作。)
记住,它会逆时针检查从角度A到角度B。如果角度介于:,则返回YES(true)
首先,一个简单的转换函数,使所有的角度1-360
检查角度是否介于:)
检查角度300是否在180到10度之间:
//返回YES
试试看
原因是角度的差异是
facingAngle - angleOfTarget
尽管由于包装效果,可能会关闭360度。加法180+360,然后模360,然后减法180,实际上就是把所有的东西都转换成-180到180度的范围(通过加减360度)。
然后你可以很容易地检查角度差,是否在-45到45度之间。
相关问题 更多 >
编程相关推荐