2angular之间的最小差异

给定在坐标周围的-PI-> PI范围内的两个angular度,它们之间的两个angular度中最小的值是多less?

考虑到PI和-PI之间的差异不是2PI,而是零。

例:

设想一个圆圈,从中心出来有两条线,这两条线之间有两个angular度,它们在内部形成的angular度又称为较小的angular度 ,以及它们在外部形成的angular度,也就是更大的angular度。 两个angular度加起来就成了一个整圆。 考虑到每个angular度可以在一定的范围内, angular度值越小,考虑到侧翻

这为任何angular度提供了一个有符号的angular度:

a = targetA - sourceA a = (a + 180) % 360 - 180 

注意在许多语言中, modulo运算返回一个与红利相同符号的值(如C,C ++,C#,JavaScript, 完整列表 )。 这需要一个自定义的mod函数,如下所示:

 mod = (a, n) -> a - floor(a/n) * n 

或者:

 mod = (a, n) -> (a % n + n) % n 

如果angular度在[-180,180]之内,这也是有效的:

 a = targetA - sourceA a += (a>180) ? -360 : (a<-180) ? 360 : 0 

以更详细的方式:

 a = targetA - sourceA a -= 360 if a > 180 a += 360 if a < -180 

x是目标angular度。 y是源或起始angular度:

 atan2(sin(xy), cos(xy)) 

它返回有符号的deltaangular度。 请注意,根据您的API,atan2()函数的参数顺序可能会有所不同。

如果你的两个angular度是x和y,那么它们之间的angular度之一是abs(x – y)。 另一个angular度是(2 * PI) – abs(x – y)。 所以这两个angular度中最小的值是:

 min((2 * PI) - abs(x - y), abs(x - y)) 

这给出angular度的绝对值,并且假定input被归一化(即:在[0, 2π)的范围内)。

如果要保留angular度的符号(即:方向),并且接受范围[0, 2π)以外的angular度[0, 2π)可以概括上述内容。 以下是广义版本的Python代码:

 PI = math.pi TAU = 2*PI def smallestSignedAngleBetween(x, y): a = (x - y) % TAU b = (y - x) % TAU return -a if a < b else b 

请注意, %运算符在所有语言中performance不一样,特别是当涉及负值时,所以如果移植一些符号调整可能是必要的。

我遇到了提供签名答案的挑战:

 def f(x,y): import math return min(yx, y-x+2*math.pi, yx-2*math.pi, key=abs) 

算术(而不是algorithm)解决scheme:

 angle = Pi - abs(abs(a1 - a2) - Pi); 

对于UnityEngine用户来说,简单的方法就是使用Mathf.DeltaAngle 。

没有必要计算三angular函数。 C语言的简单代码是:

 #include <math.h> #define PIV2 M_PI+M_PI #define C360 360.0000000000000000000 double difangrad(double x, double y) { double arg; arg = fmod(yx, PIV2); if (arg < 0 ) arg = arg + PIV2; if (arg > M_PI) arg = arg - PIV2; return (-arg); } double difangdeg(double x, double y) { double arg; arg = fmod(yx, C360); if (arg < 0 ) arg = arg + C360; if (arg > 180) arg = arg - C360; return (-arg); } 

让dif = a – b,以弧度

 dif = difangrad(a,b); 

让dif = a – b,以度为单位

 dif = difangdeg(a,b); difangdeg(180.000000 , -180.000000) = 0.000000 difangdeg(-180.000000 , 180.000000) = -0.000000 difangdeg(359.000000 , 1.000000) = -2.000000 difangdeg(1.000000 , 359.000000) = 2.000000 

没有罪,没有因果关系,没有晒黑,只有几何!