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
没有罪,没有因果关系,没有晒黑,只有几何!